在Swift中應用Cocoa的現有設計形式引見。本站提示廣大學習愛好者:(在Swift中應用Cocoa的現有設計形式引見)文章只能為提供參考,不一定能成為您想要的結果。以下是在Swift中應用Cocoa的現有設計形式引見正文
應用 Cocoa 現有的一些設計形式,是贊助開辟者開辟一款具有公道設計思緒、穩固的機能、優越的可擴大性運用的有用辦法之一。這些形式都依附於在 Objective-C 中界說的類。由於 Swift 與 Objective-C 的互用性,所以你仍然可以在 Swift 代碼中應用這些設計形式。在一些情形下,你乃至可使用 Swift 說話的特征擴大或簡化這些 Cocoa 設計形式,使這些設計形式更壯大、更容易於應用。
拜托(Delegation)
在 Swift 和 Objective-C 中,拜托平日由一個界說交互辦法和遵守標准的拜托屬性的協定表現。與 Objective-C 比擬,當你在 Swift 中繼續一個拜托時,固然繼續形式不變,然則外部的完成曾經轉變了。就像在 Objective-C 中,在你向拜托發送新聞之前,不論它是否是 nil 你都邑去檢查,假如界說的辦法長短必需完成的辦法,不論拜托有無完成這個辦法,你也都邑去檢查。而在 Swift 中,經由過程堅持類型平安的特征,可以有用的清除這些繁瑣、不用要的行動成績。
上面列出的代碼可以解釋這個進程:
1.檢討 myDelegate 不為 nil。
2.檢討 myDelegate 能否完成了繼續的 window:willUseFullScreenContentSize: 辦法。
3.假如myDelegate 不為 nil 而且完成了 window:willUseFullScreenContentSize: 辦法4.那末挪用該辦法,將該辦法的前往值分派給名為 fullScreenSize 的屬性。
將該辦法的前往值輸入在掌握台。
// @inteface MyObject : NSObject
// @property (nonatomic, weak) id<NSWindowDelegate> delegate;
// @end
if let fullScreenSize = myDelegate?.window?(myWindow, willUseFullScreenContentSize: mySize) {
println(NSStringFromSize(fullScreenSize))
}
留意: 在一個完整應用 Swift 編寫的 app 中,在界說 delegate 屬性時,它作為一個不定值的 NSWindowDelegate 對象,並將初始值設為 nil。
延遲初始化(Lazy Initialization)
你可以在 Lazy Stored Properties 中懂得到更多關於延遲初始化的信息。
毛病申報(Error Reporting)
Swift 中的毛病申報形式沿用了 Objective-C 的形式,但 Swift 中不定值前往值的新特征給我們帶來了額定的利益。舉個很簡略的例子,你用 Bool 值作為一個函數的前往值,用於標識該函數能否履行勝利,當你須要輸入毛病信息時,你可以在函數中添加一個NSErrorPointer 類型的輸入參數 NSError。這個類型相似 Objective-C 中的 NSError **,並增長了內存平安性和非強迫性的傳參。你可使用 & 運算符作為前綴援用一個不定值 NSError 類型作為 NSErrorPointer 對象傳遞毛病信息。以下面的代碼所示:
var writeError : NSError?
let written = myString.writeToFile(path, atomically: false,
encoding: NSUTF8StringEncoding,
error: &writeError)
if !written {
if let error = writeError {
println("write failure: \(error.localizedDescription)")
}
}
當你完成本身的辦法時,你須要設置裝備擺設一個 NSErrorPointer 對象,並將 NSErrorPointer 對象的 memory 屬性設為你創立的NSError 對象。起首檢討挪用者傳遞的參數,確保它是一個非 nil 的 NSError 對象。
復制純文本新窗口
func contentsForType(typeName: String! error: NSErrorPointer) -> AnyObject! {
if cannotProduceContentsForType(typeName) {
if error {
error.memory = NSError(domain: domain, code: code, userInfo: [:])
}
return nil
}
// ...
}
Target-Action形式(Target-Action)
當有特定事宜產生,須要一個對象向另外一個對象發送新聞時,我們平日采取 Cocoa 的 Target-Action 設計形式。Swift 和 Objective-C 中的 Target-Action 模子根本相似。在 Swift 中,你可使用 Selector 類型到達 Objective-C 中 selectors 的後果。請在Objective-C Selectors 中檢查在 Swift 中應用 Target-Action 設計形式的示例。
類型婚配與同一標准(Introspection)
在 Objective-C 中,你可使用 isKindOfClass: 辦法檢討某個對象能否是指定類型,可使用 conformsToProtocol: 辦法檢討某個對象能否遵守特定協定的標准。在 Swift 中,你可使用 is 運算符完成上述的功效,或許也能夠應用 as? 向下婚配指定類型。
你可使用 is 運算符檢討一個實例能否是指定的子類。假如該實例是指定的子類,那末 is 運算成果為 true,反之為false。
if object is UIButton {
// object is of type UIButton
} else {
// object is not of type UIButton
}
你也能夠應用 as? 運算符測驗考試向下婚配子類型,as? 運算符前往不定值,聯合 if-let 語句應用。
if let button = object as? UIButton {
// object is successfully cast to type UIButton and bound to button
} else {
// object could not be cast to type UIButton
}
請在 Type Casting 中檢查更多信息。
檢討婚配協定的語法與檢討婚配類的語法是一樣的,上面是應用 as? 檢討婚配協定的示例:
if let dataSource = object as? UITableViewDataSource {
// object conforms to UITableViewDataSource and is bound to dataSource
} else {
// object not conform to UITableViewDataSource
}
留意,當作完婚配以後,dataSource 會轉換為 UITableViewDataSource 類型,所以你只能拜訪和挪用UITableViewDataSource 協定界說的屬性和辦法。當你想停止其他操作時,必需將其轉換為其他的類型。
可以在 Protocols 檢查更多相干信息。