在Swift中使用Objective-C編寫(xiě)類(lèi)、繼承Objective-C類(lèi)
互用性(互操作性)使開(kāi)發(fā)者可以定義融合了 Objective-C 語(yǔ)言特性的Swift類(lèi)。編寫(xiě) Swift 類(lèi)時(shí),不僅可以繼承 Objective-C 語(yǔ)言編寫(xiě)的父類(lèi),采用 Objective-C 的協(xié)議,還可以利用 Objective-C 的一些其它功能。這意味著,開(kāi)發(fā)者可以基于 Objective-C 中已有的熟悉、可靠的類(lèi)、方法和框架來(lái)創(chuàng)建 Swift 類(lèi),并結(jié)合 Swift 提供的現(xiàn)代化和更有效的語(yǔ)言特點(diǎn)對(duì)其進(jìn)行優(yōu)化。
繼承Objective-C的類(lèi)
在 Swift 中,開(kāi)發(fā)者可以定義一個(gè)子類(lèi),該子類(lèi)繼承自使用 Objective-C 編寫(xiě)的類(lèi)。創(chuàng)建該子類(lèi)的方法是,在 Swift 的類(lèi)名后面加上一個(gè)冒號(hào)(:),冒號(hào)后面跟上 Objective-C 的類(lèi)名。
// SWIFT
import UIKit
class MySwiftViewController: UIViewController {
// 定義類(lèi)
}
開(kāi)發(fā)者能夠從 Objective-C 的父類(lèi)中繼承所有的功能。如果開(kāi)發(fā)者要覆蓋父類(lèi)中的方法,不要忘記使用override關(guān)鍵字。
采用協(xié)議
在 Swift 中,開(kāi)發(fā)者可以采用 Objective-C 中定義好的協(xié)議。和 Swift 協(xié)議一樣,所有 Objective-C 協(xié)議都寫(xiě)在一個(gè)用逗號(hào)隔開(kāi)的列表中,跟在所在類(lèi)的父類(lèi)名后面(如果它有父類(lèi)的話(huà))。
// SWIFT
class MySwiftViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
// 定義類(lèi)
}
Objective-C 協(xié)議與 Swift 協(xié)議使用上是一致的。如果開(kāi)發(fā)者想在 Swift 代碼中引用 UITableViewDelegate協(xié)議,可以直接使用UITableViewDelegate(跟在 Objective-C 中引用id<UITableViewDelegate\>是等價(jià)的)。
編寫(xiě)構(gòu)造器和析構(gòu)器
Swift 的編譯器確保在初始化時(shí),構(gòu)造器不允許類(lèi)里有任何未初始化的屬性,這樣做能夠增加代碼的安全性和可預(yù)測(cè)性。另外,與 Objective-C 語(yǔ)言不同,Swift 不提供單獨(dú)的內(nèi)存分配方法供開(kāi)發(fā)者調(diào)用。當(dāng)你使用原生的 Swift 初始化方法時(shí)(即使是和 Objective-C 類(lèi)協(xié)作),Swift 會(huì)將 Objective-C 的初始化方法轉(zhuǎn)換為 Swift 的初始化方法。關(guān)于如何實(shí)現(xiàn)開(kāi)發(fā)者自定義構(gòu)造器的更多信息,請(qǐng)查看構(gòu)造器。
當(dāng)開(kāi)發(fā)者希望在類(lèi)被釋放前,執(zhí)行額外的清理工作時(shí),需要執(zhí)行一個(gè)析構(gòu)過(guò)程來(lái)代替dealloc方法。在實(shí)例被釋放前,Swift 會(huì)自動(dòng)調(diào)用析構(gòu)器來(lái)執(zhí)行析構(gòu)過(guò)程。Swift 調(diào)用完子類(lèi)的析構(gòu)器后,會(huì)自動(dòng)調(diào)用父類(lèi)的析構(gòu)器。當(dāng)開(kāi)發(fā)者使用 Objective-C 類(lèi)或者是繼承自 Objective-C 類(lèi)的 Swift 類(lèi)時(shí),Swift 也會(huì)自動(dòng)為開(kāi)發(fā)者調(diào)用這個(gè)類(lèi)的父類(lèi)里的dealloc方法。關(guān)于如何實(shí)現(xiàn)開(kāi)發(fā)者自定義析構(gòu)器的更多信息,請(qǐng)查看析構(gòu)器。
集成Interface Builder
Swift 編譯器包含一些屬性,使得開(kāi)發(fā)者的 Swift 類(lèi)集成了 Interface Builder 里的一些特色功能。和 Objective-C 里一樣,你能在 Swift 里面使用 OutLets,actions 和實(shí)時(shí)渲染(live rendering)。
使用Outlets和Action
使用 Outlets 和 Action 可以連接源代碼和 Interface Builder 的 UI 對(duì)象。在Swift里面使用 Outlets 和 Action,需要在屬性和方法聲明前插入@IBOutlet或者@IBAction關(guān)鍵字。聲明一個(gè) Outlet集合同樣是用@IBOutlet屬性,即為類(lèi)型指定一個(gè)數(shù)組。
當(dāng)開(kāi)發(fā)者在 Swift 里面聲明了一個(gè) Outlet 時(shí),Swift 編譯器會(huì)自動(dòng)將該類(lèi)型轉(zhuǎn)換為弱(weak)、隱式(implicitly)、未包裝(unwrapped)的 optional(Object-c里面對(duì)應(yīng)指針類(lèi)型)數(shù)據(jù)類(lèi)型,并為它分配一個(gè)初始化的空值nil。實(shí)際上,編譯器使用@IBOutlet weak var name: Type! = nil來(lái)代替 @IBOutlet var name: Type。編譯器將該類(lèi)型轉(zhuǎn)換成了弱(weak)、隱式(implicitly)、未包裝(unwrapped)的 optional 類(lèi)型,因此開(kāi)發(fā)者就不需要在構(gòu)造器中為該類(lèi)型分配一個(gè)初始值了。當(dāng)開(kāi)發(fā)者從故事板(storyboard)或者xib文件里面初始化對(duì)象 class 后,定義好的 Outlet 和這些對(duì)象連接在一起了,所以,這些 Outlet 是隱式的,未包裝的。由于創(chuàng)建的 outlets 一般都是弱關(guān)系,因此默認(rèn) outlets 是弱類(lèi)型。
例如,下面的 Swift 代碼聲明了一個(gè)擁有 Outlet、Outlets 集合和 Action 的類(lèi):
// SWIFT
class MyViewController: UIViewController {
@IBOutlet var button: UIButton
@IBOutlet var textFields: UITextField[]
@IBAction func buttonTapped(AnyObject) {
println("button tapped!")
}
}
在buttonTapped方法中,消息發(fā)送者的信息沒(méi)有被使用,因此可以省略該方法的參數(shù)名。
實(shí)時(shí)渲染(live rendering)
開(kāi)發(fā)者可以在Interface Builder中用@IBDesignable和@IBInspectable來(lái)創(chuàng)建生動(dòng)、可交互的自定義視圖(view)。開(kāi)發(fā)者繼承UIView或者NSView來(lái)自定義一個(gè)視圖(view)時(shí),可以在類(lèi)聲明前添加@IBDesignable屬性。當(dāng)你在 Interface Builder 里添加了自定義的視圖后(在監(jiān)視器面板的自定義視圖類(lèi)中進(jìn)行設(shè)置),Interface Builder 將在畫(huà)布上渲染你自定義的視圖。
注意:只能針對(duì)框架里對(duì)象進(jìn)行實(shí)時(shí)渲染
你也可以將@IBInspectable屬性添加到和用戶(hù)定義的運(yùn)行時(shí)屬性兼容的類(lèi)型屬性里。這樣,當(dāng)開(kāi)發(fā)者將自定義的視圖添加到 Interface Builder 里后,就可以在監(jiān)視器面板中編輯這些屬性。
// SWIFT
@IBDesignable
class MyCustomView: UIView {
@IBInspectable var textColor: UIColor
@IBInspectable var iconHeight: CGFloat
/* ... */
}
指明屬性特性
在 Objective-C 中,屬性通常都有一組特性(Attributes)說(shuō)明來(lái)指明該屬性的一些附加信息。在 Swift 中,開(kāi)發(fā)者可以通過(guò)不同的方法來(lái)指明屬性的這些特性。
強(qiáng)類(lèi)型和弱類(lèi)型
Swift 里屬性默認(rèn)都是強(qiáng)類(lèi)型的。使用weak關(guān)鍵字修飾一個(gè)屬性,能指明其對(duì)象存儲(chǔ)時(shí)是一個(gè)弱引用。該關(guān)鍵字僅能修飾 optional 對(duì)象類(lèi)型。更多的信息,請(qǐng)查閱特性。
讀/寫(xiě)和只讀
在 Swift 中,沒(méi)有readwrite和readonly特性。當(dāng)聲明一個(gè)存儲(chǔ)型屬性時(shí),使用let修飾其為只讀;使用var修飾其為可讀/寫(xiě)。當(dāng)聲明一個(gè)計(jì)算型屬性時(shí),為其提供一個(gè) getter 方法,使其成為只讀的;提供 getter 方法和 setter 方法,使其成為可讀/寫(xiě)的。更多信息,請(qǐng)查閱屬性。
拷貝
在 Swift 中,Objective-C 的copy特性被轉(zhuǎn)換為@NSCopying屬性。這一類(lèi)的屬性必須遵守 NSCopying協(xié)議。更多信息,請(qǐng)查閱特性。
實(shí)現(xiàn)Core Data Managed Object子類(lèi)
Core Data 提供了基本存儲(chǔ)和實(shí)現(xiàn)NSManagedObject子類(lèi)的一組屬性。在 Core Data 模型中,與管理對(duì)象子類(lèi)相關(guān)的特性或者關(guān)系的每個(gè)屬性定義之前,將@NSmanaged特性加入。與 Objective-C 里面的 @dynamic特性類(lèi)似,@NSManaged特性告知 Swift 編譯器,這個(gè)屬性的存儲(chǔ)和實(shí)現(xiàn)將在運(yùn)行時(shí)完成。但是,與@dynamic不同的是,@NSManaged特性?xún)H在 Core Data 支持中可用。
相關(guān)文章
Swift如何在應(yīng)用中添加圖標(biāo)更換功能的方法
本篇文章主要介紹了Swift如何在應(yīng)用中添加圖標(biāo)更換功能的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02Swift實(shí)現(xiàn)簡(jiǎn)單計(jì)算器
這篇文章主要為大家詳細(xì)介紹了Swift實(shí)現(xiàn)簡(jiǎn)單計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01Swift使用WKWebView在iOS應(yīng)用中調(diào)用Web的方法詳解
這篇文章主要介紹了Swift使用WKWebView在iOS應(yīng)用中調(diào)用Web的方法詳解,使用WKWebView便等于使用和Safari中相同的JavaScript解釋器,用來(lái)替代過(guò)去的UIWebView,需要的朋友可以參考下2016-04-04Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model的方法及HandyJSON使用講解
這篇文章給大家介紹了Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model的方法及HandyJSON使用講解,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-07-07Swift學(xué)習(xí)教程之訪問(wèn)控制詳解
訪問(wèn)控制可以限定你在源文件或模塊中訪問(wèn)代碼的級(jí)別,也就是說(shuō)可以控制哪些代碼你可以訪問(wèn),哪些代碼你不能訪問(wèn)。下面這篇文章主要給大家介紹了關(guān)于Swift學(xué)習(xí)教程之訪問(wèn)控制的相關(guān)資料,需要的朋友可以參考下。2017-08-08swift控件工廠類(lèi)的實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了swift控件工廠類(lèi)的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09Swift中switch語(yǔ)句區(qū)間和元組模式匹配
這篇文章主要介紹了Swift中switch語(yǔ)句區(qū)間和元組模式匹配的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12使用Swift實(shí)現(xiàn)iOS App中解析XML格式數(shù)據(jù)的教程
這篇文章主要介紹了使用Swift實(shí)現(xiàn)iOS App中解析XML格式數(shù)據(jù)的教程,講到了iOS中提供的NSXMLParser和NSXMLParserDelegate兩個(gè)API的用法,需要的朋友可以參考下2016-04-04