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)
        }
    }
}