第十七章 Swift 類

Swift 類可以沒有基類粗合,自己作為基類則沒有super萍嬉。

class Model {
    
}

class Model1: NSObject {
    
    override init() {
        super.init()
    }
}

class Model2: Model {
    
}

類和結(jié)構(gòu)體相比,擁有繼承隙疚、動態(tài)等能力壤追,并且是引用計數(shù)管理內(nèi)存。

1.創(chuàng)建一個類

創(chuàng)建基類相對繼承父類代碼要簡潔供屉,這里僅用繼承父類舉例行冰。

class ViewController: UIViewController {
    let fps: Int
    
    init(fps: Int) {
        self.fps = fps
        super.init(nibName: nil, bundle: nil)
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

上例中創(chuàng)了一個繼承UIViewController的類ViewController,他有一個fps屬性伶丐,在使用super前必須將自身全部屬性初始化完畢悼做,然后才能調(diào)用父類的designed init

2. 重寫父類方法

重寫方法必須先加上override關(guān)鍵字哗魂,可以通過super調(diào)用父類實現(xiàn)肛走。

override func viewDidLoad() {
        super.viewDidLoad()
}

如果父類方法添加了關(guān)鍵字required,則子類必須實現(xiàn)該方法录别。

required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
}

注意:子類重寫的函數(shù)和屬性朽色,其權(quán)限不能小于父類權(quán)限故硅。

// error: Overriding property must be as accessible as its enclosing type
override private var supportedInterfaceOrientations: UIInterfaceOrientationMask { return .portrait }

3. 重寫父類擴展的方法

擴展的方法必須加上@objc才能被子類重寫,重寫時也需要加上@objc

extension UIViewController {
    func log() {
        print("UIViewController")
    }
}

extension ViewController {
    // error: Overriding non-@objc declarations from extensions is not supported
   override func log() {
        print("ViewController")
    }
}
extension UIViewController {
    @objc func log() {
        print("UIViewController")
    }
}

extension ViewController {
    @objc override func log() {
        print("ViewController")
    }
}

4. Runtime

Swift類需要使用Runtime則必須繼承NSObject以及添加@objc標(biāo)記,包括要用到的屬性纵搁。

@objcclass User: NSObject {
    @objc let name: String
    @objc let age: UInt
    
    init(name: String,
         age: UInt) {
        self.name = name
        self.age = age
    }
    
    func keyValues() -> [String: Any] {
        var res = [String: Any]()
        
        var count: UInt32 = 0
        let properties = class_copyPropertyList(self.classForCoder, &count)
        for i in 0..<count {
            guard let property = properties?[Int(i)] else { continue }
            let name = String(cString: property_getName(property))
            let value = self.value(forKey: name)
            res[name] = value
        }
        
        return res
    }
}

如果覺得給每個屬性添加@objc比較麻煩吃衅,可以添加@objcMembers,這樣所有屬性都可以被runtime捕捉到。

@objcMembers class User: NSObject {
    let name: String
    let age: UInt
    
    init(name: String,
         age: UInt) {
        self.name = name
        self.age = age
    }
    
    func keyValues() -> [String: Any] {
        var res = [String: Any]()
        
        var count: UInt32 = 0
        let properties = class_copyPropertyList(self.classForCoder, &count)
        for i in 0..<count {
            guard let property = properties?[Int(i)] else { continue }
            let name = String(cString: property_getName(property))
            let value = self.value(forKey: name)
            res[name] = value
        }
        
        return res
    }
}

5. 與OC交互

Swift類導(dǎo)入OC則必須繼承NSObject以及添加@objc標(biāo)記腾誉,同時可以利用@objc提供OC專用別用徘层,而OC導(dǎo)入Swift則簡單的多。

  • 可以使用@objc重命名
@objc(PKUser) class User: NSObject {

}

@objc(testInOC) func test() {
 
}

@objc(testForOCWithA:orB:andC:) func test(a:Any, b:Any, c:Any) {

}

  • 不想暴露給OC可以添加@nonobjc,但是現(xiàn)在默認不添加@objc了利职,故@nonobjc僅在@objcMembers下隱藏某些內(nèi)容有用(之前的版本默認給函數(shù)和屬性添加@objc趣效,有@objc才會暴露給OC)。
@nonobjc func swiftOnly() {
        
}

6. 引用循環(huán)

可以使用weak避免引用循環(huán)

weak var delegate: UITableViewDelegate?

在閉包中可以使用unownedweak避免引用循環(huán)猪贪。(詳解在閉包章節(jié))

let block1 = { [unowned self] in
    print(self.view)
}

let block2 = { [weak self] in
    print(self?.view)
}

7. 與OC的不同

  • Swift的資源釋放在deinit中完成跷敬,dealloc不再被提供。
  • Swift沒有load函數(shù)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末热押,一起剝皮案震驚了整個濱河市西傀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌桶癣,老刑警劉巖拥褂,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異牙寞,居然都是意外死亡饺鹃,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門间雀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悔详,“玉大人,你說我怎么就攤上這事惹挟∏洋Γ” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵匪煌,是天一觀的道長责蝠。 經(jīng)常有香客問我,道長萎庭,這世上最難降的妖魔是什么霜医? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮驳规,結(jié)果婚禮上肴敛,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好医男,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布砸狞。 她就那樣靜靜地躺著,像睡著了一般镀梭。 火紅的嫁衣襯著肌膚如雪刀森。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天报账,我揣著相機與錄音研底,去河邊找鬼。 笑死透罢,一個胖子當(dāng)著我的面吹牛榜晦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播羽圃,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼乾胶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了朽寞?” 一聲冷哼從身側(cè)響起识窿,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎愁憔,沒想到半個月后腕扶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡吨掌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了脓恕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膜宋。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖炼幔,靈堂內(nèi)的尸體忽然破棺而出秋茫,到底是詐尸還是另有隱情,我是刑警寧澤乃秀,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布肛著,位于F島的核電站,受9級特大地震影響跺讯,放射性物質(zhì)發(fā)生泄漏枢贿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一刀脏、第九天 我趴在偏房一處隱蔽的房頂上張望局荚。 院中可真熱鬧,春花似錦、人聲如沸耀态。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽首装。三九已至创夜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間仙逻,已是汗流浹背驰吓。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留桨醋,地道東北人棚瘟。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像喜最,于是被迫代替她去往敵國和親药磺。 傳聞我的和親對象是個殘疾皇子骗污,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,092評論 1 32
  • 參考資源《swifter》https://github.com/iOS-Swift-Developers/Swif...
    柯浩然閱讀 1,439評論 0 6
  • 參考鏈接: http://www.cnblogs.com/ioshe/p/5489086.html 簡介 Runt...
    樂樂的簡書閱讀 2,132評論 0 9
  • 引導(dǎo) 對于從事 iOS 開發(fā)人員來說,所有的人都會答出「 Runtime 是運行時 」,什么情況下用 Runtim...
    Winny_園球閱讀 308評論 0 0
  • 這幾天在看《原則》桩卵,但是我發(fā)現(xiàn)很多東西我不是看不懂闷盔,而是看不下去,那么厚一本書能真,雖然這本書我很喜歡赁严,但要每天都看就...
    Tiffany自由的風(fēng)閱讀 263評論 0 0