Swift 类
0.备注
以前在 OC 上面用 #pragma mark 注释
#pragma mark - 备注
而swift 则改用了 //MARK
//MARK : 备注
1.类 Person.swift
import UIKit
class Person {
}
2.继承自 NSObject 的类 Person.swift
import UIKit
class Person: NSObject {
}
3.对象的实例
let man = Person()
4.实例方法
import UIKit
class Person: NSObject {
func show() -> Void {
print("对象方法...")
}
}
5.实例方法的调用
let man = Person()
man.show()
6.类方法
import UIKit
class Person: NSObject {
static func dosome() -> Void {
print("类方法...")
}
class func dosomething() -> Void {
print("类方法2...")
}
}
6.1.类方法的调用
Person.dosome()
Person.dosomething()
7.结构体、枚举的类方法
import UIKit
struct Book {
static func show() -> Void {
print("结构体的类方法")
}
}
enum Book {
static func show() -> Void {
print("枚举的类方法")
}
}
7.1.结构体、枚举的类方法 使用
Book.show()
var book : Book = Book.Red
book = Book.Green
if book == Book.Green {
print("绿之书")
Book.show()
} else {
print("其他书")
}
8.类的属性
import UIKit
class Person: NSObject {
var name: String?
}
8.0.类的属性的公开性
var name: String?
的效果和
public var name: String?
差不多,都可以将属性开放出来。
而:
private var name: String?
则是外部所无法访问的。属于私有属性。
8.1.类的属性使用
let man = Person()
man.name = "muzico"
if man.name != nil {
print("Person.name = \(man.name!)")
} else {
print("Person.name 内容为空")
}
9.类的属性,添加默认值
import UIKit
class Person: NSObject {
var name: String? = "无名"
}
10.构建函数 init
import UIKit
class Person: NSObject {
var name: String?
init(name : String) {
super.init()
self.name = name
}
}
如果自定义了 构建函数 init,则默认的会消失,无法使用。
10.1.构建函数 init 使用
let man = Person(name: "muzico")
或者
let man = Person.init(name: "muzico")
建议是下面的方法,因为Xcode的提示更好~~~
11.多构建函数 init
import UIKit
class Person: NSObject {
var name: String?
var age: Int = 0
init(name : String) {
super.init()
self.name = name
}
init(name : String, age : Int) {
super.init()
self.name = name
self.age = age
}
}
11.1.多构建函数 init 使用
let man = Person(name: "muzico")
let man2 = Person(name: "muzico", age: 18)
let man = Person.init(name: "muzico")
let man2 = Person.init(name: "muzico", age: 18)
12.无标签的构建函数(也适用于方法)
import UIKit
class Person: NSObject {
var name: String?
var age: Int = 0
init(_ name : String) {
super.init()
self.name = name
}
}
"_" 代表无标签,编译器将不会出现标签的名字
12.1.无标签的构建函数 使用
let man = Person.init("muzico")
let man2 = Person("muzico")
12.2.因为无标签,所以可以达成方法、函数的重载
import UIKit
class Person: NSObject {
var name: String?
var age: Int = 0
init(_ name : String) {
super.init()
self.name = name
}
init(_ age : Int) {
super.init()
self.age = age
}
init(_ name : String, _ age : Int) {
super.init()
self.name = name
self.age = age
}
init(_ age : Int, _ name : String) {
super.init()
self.name = name
self.age = age
}
}
12.3.因为无标签,所以可以达成方法、函数的重载 使用
let man = Person("muzcio")
let man2 = Person(18)
let man3 = Person("muzico", 18)
let man4 = Person(18, "muzico")
12.4.有标签的方法
import UIKit
class Person: NSObject {
var name: String?
var age: Int = 0
init(_ name : String) {
super.init()
self.name = name
}
init(_ age : Int) {
super.init()
self.age = age
}
init(_ name : String, _ age : Int) {
super.init()
self.name = name
self.age = age
}
init(_ age : Int, _ name : String) {
super.init()
self.name = name
self.age = age
}
init(PersonName name : String) {
super.init()
self.name = name
}
}
默认标签即为参数名,如果写出了标签,则必须用标签。
12.5.有标签的方法 使用
let man = Person("muzcio")
let man2 = Person(18)
let man3 = Person("muzico", 18)
let man4 = Person(18, "muzico")
let man5 = Person(PersonName: "muzico")
13.属性的 setter getter
import UIKit
class Person: NSObject {
private var _name: String?
var name: String? {
get {
if _name == nil {
_name = "无名"
}
return _name
}
set {
_name = newValue;
}
}
var age: Int = 0
override init() {
super.init()
}
init(name : String) {
super.init()
self._name = name
}
init(name : String, age : Int) {
super.init()
self._name = name
self.age = age
}
}
14.属性的只读
import UIKit
class Person: NSObject {
private var _name: String?
var name: String? {
get {
if _name == nil {
_name = "无名"
}
return _name
}
}
var age: Int = 0
override init() {
super.init()
}
init(name : String) {
super.init()
self._name = name
}
init(name : String, age : Int) {
super.init()
self._name = name
self.age = age
}
}
15.属性另一种只读写法
import UIKit
class Person: NSObject {
private var _name: String?
var name: String? {
get {
if _name == nil {
_name = "无名"
}
return _name
}
}
var age: Int = 0
override init() {
super.init()
}
init(name : String) {
super.init()
self._name = name
}
init(name : String, age : Int) {
super.init()
self._name = name
self.age = age
}
}
16.extension 实例方法
Person.swift:
import UIKit
class Person: NSObject {
var name: String?
init(_ name : String) {
super.init()
self.name = name
}
}
Person+.swift:
import Foundation
extension Person {
var callName : String {
if self.name == nil {
return "Mr." + "无名"
}
return "Mr." + self.name!
}
}
使用:
let man = Person("muzico")
print("call name : \(man.callName)")
17.extension 类方法
Person.swift:
import UIKit
class Person: NSObject {
}
Person+.swift:
import Foundation
extension Person {
class func show() -> Void {
print("扩充的类方法")
}
}
使用:
Person.show()
18.extension 属性
Person.swift:
import UIKit
class Person: NSObject {
}
Person+.swift:
import Foundation
extension Person {
private struct theName {
static var nameValue: String = ""
}
var name: String? {
get {
guard let temp = objc_getAssociatedObject(self, &theName.nameValue) as? String else {
return nil
}
return temp
}
set {
objc_setAssociatedObject(self, &theName.nameValue, newValue, .OBJC_ASSOCIATION_RETAIN)
}
}
}