中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
[精校版]Using Swift with Cocoa and Objective-C--互用性--Cocoa數(shù)據(jù)類型

Swift系列文章由CocoaChina翻譯小組翻譯自蘋果的官方文檔:The Swift Programming Language--Interoperability--Working with Cocoa Data Types。 本篇譯者:wongzigii(Github主頁),敬請勘誤,歡迎在CocoaChina github主頁查看更多文章。


作為對 Objective-C 互用性(互操作性)的一部分,Swift提供快捷高效的方式來處理Cocoa數(shù)據(jù)類型。
Swift 會自動將一些 Objective-C 類型轉(zhuǎn)換為 Swift 類型,以及將 Swift 類型轉(zhuǎn)換為 Objective-C 類型。在 Objective-C 和 Swift 中也有一些具有互用性的數(shù)據(jù)類型。那些可轉(zhuǎn)換的數(shù)據(jù)類型或者具有互用性的數(shù)據(jù)類型被稱為bridged數(shù)據(jù)類型。舉個例子,在 Swift 中,您可以將一個Array值傳遞給一個要求為NSArray對象的方法。你也可以轉(zhuǎn)換一個 bridged 類型和它的副本。當(dāng)你使用as轉(zhuǎn)換 bridged 類型或者那些由常量和變量所提供的類型時,Swift 會橋接它們的數(shù)據(jù)類型。
Swift 也提供一種簡單便捷的覆蓋方法來連接 Foundation 的數(shù)據(jù)類型,在后面的 Swift 語言中,你能在它的句法中感受到自然和統(tǒng)一。
字符串
Swift會在String類型和NSString類型中自動轉(zhuǎn)換。這意味著在可以使用NSString對象的地方,您可以使用一個屬于 Swift 的String類型代替它,這樣做會同時擁有它們數(shù)據(jù)類型的特點,String類型的插值,基于Swift設(shè)計的APIs以及NSString類更廣的適用范圍。因此,您幾乎不必再在你的代碼中使用NSString類。事實上,當(dāng) Swift 接入 Objective-C APIs 時,它將把所有NSString類型替換為String類型。當(dāng)您在您的Objective-C代碼中使用 Swift 類時,接入的API會將所有String類型替換成NSString類型。
為了允許字符串轉(zhuǎn)換,只需接入Foundation。舉個例子,您在 Swift 的一個字符串中調(diào)用了capitalizedString--一個NSString類的方法,此后 Swift 會自動將String轉(zhuǎn)換為一個NSString對象并調(diào)用方法。這個方法甚至?xí)祷匾粋€ Swift 的String類型,因為它在接入的時候被替換了。
  1. import Foundation 
  2. let greeting = "hello, world!" 
  3. let capitalizedGreeting = greeting.capitalizedString 
  4. // capitalizedGreeting: String = Hello, World! 
如果您確實需要用到一個NSString對象,您可以用一個 Swift 的String值并轉(zhuǎn)換它。String類型總是可以從一個NSString對象轉(zhuǎn)換為一個Swift的String的值,因此,再沒有必要去使用一個可選的類型轉(zhuǎn)換器()as?)。您也可以再一個字符串中通過定義常量和變量來創(chuàng)建一個NSString對象。
  1. import Foundation 
  2. let myString: NSString = "123" 
  3. if let integerValue = (myString as String).toInt()){ 
  4.     println("\(myString) is the integer \(integerValue)")  
本地化
在Objective-C中,常用NSLocalizedString類的宏來定位一個字符串。這集合的宏包括NSLocalizedStringFromTableInBundle和NSLocalizedStringWithDefaultValue。而在Swift中,只用一個函數(shù)就可以實現(xiàn)跟整個NSLocalizedString集一樣的功能,即NSLocalizedString(key:tableName:bundle:value:comment:)。這個NSLocalizedString函數(shù)分別為tableName,bundle和value參數(shù)提供了一個默認(rèn)值。你可以用它來替換宏。
數(shù)字
Swift會自動將已確定的數(shù)字類型Int和Float轉(zhuǎn)換為NSNumber。這樣的轉(zhuǎn)換允許你基于其中一種類型創(chuàng)建一個NSNumber:
  1. let n = 42 
  2. let m: NSNumber = n 
你也能傳遞一個Int類型的值,比如傳遞給一個要求為NSNumber類型的參數(shù)。同時需要注意的是,NSNumber可以包含多種不同的類型,因此您不能把它傳遞給單一的一個Int值。
下面所列出的類型都會自動轉(zhuǎn)換為NSNumber:
Int
UInt
Float
Double
Bool
類集合
Swift 會自動將NSArray和NSDictionary類轉(zhuǎn)換為Swift里等價的類。這意味著你將受益于Swift強大的算法和得天獨厚的語法來處理集合--可互相轉(zhuǎn)換的 Foundation 和 Swift 集合類型。
數(shù)組
Swift 會在Array類型和NSArray類型中自動轉(zhuǎn)換。當(dāng)你從一個 Swift 數(shù)組轉(zhuǎn)換到一個NSArray對象,轉(zhuǎn)換后的數(shù)組是一個AnyObject[]類型的數(shù)組。如果某個對象是 Objective-C 或者 Swift 類的實例,或者這個對象可以轉(zhuǎn)換成另一種類型,那么這個對象則屬于AnyObject類型的對象。你可以將任一NSArray對象轉(zhuǎn)換成一個 Swift 數(shù)組,因為所有 Objective-C 的對象都是AnyObject類型的。正因如此,Swift 的編譯器會在接入 Objective-C APIs 的時候?qū)SArray類替換成AnyObject[]。
當(dāng)你將一個NSArray對象轉(zhuǎn)換成一個 Swift 數(shù)組后,你也可以將數(shù)組強制類型轉(zhuǎn)換成一個特定的類型。與從NSArray類轉(zhuǎn)換到AnyObject[]不同的是,從AnyObject類型的對象轉(zhuǎn)換成明確的類型并不會保證成功。由于直到運行時編譯器才知道AnyObject的對象能否被強制轉(zhuǎn)換為特定的類型,因此,從AnyObject[]轉(zhuǎn)換為SomeType[]會返回一個optional的值。舉個例子,如果你知道一個Swift數(shù)組只包含UIView類的實例(或者一個UIView類的子類),你可以將AnyObject類型的數(shù)組元素強制轉(zhuǎn)換為UIView對象。如果Swift數(shù)組中得元素在運行時不是UIView類型的對象,那么轉(zhuǎn)換則會返回nil。
  1. let swiftyArray = foundationArray as AnyObject[] 
  2. if let downcastedSwiftArray = swiftArray as? UIView[] { 
  3.     // downcastedSwiftArray contains only UIView objects 
你也可以在for循環(huán)中將NSArray對象定向地強制轉(zhuǎn)換為特定類型的Swift數(shù)組:
  1. for aView: UIView! in foundationArray { 
  2.      // aView is of type UIView 
注意:這種轉(zhuǎn)換是強制轉(zhuǎn)換,如果轉(zhuǎn)換不成功則會在運行時產(chǎn)生錯誤信息。
當(dāng)你從 Swift 數(shù)組轉(zhuǎn)換為NSArray對象時,Swift 數(shù)組里的元素必須是屬于AnyObject的。例如,一個Int[]類型的 Swift 數(shù)組包含Int結(jié)構(gòu)的元素。Int類型并不是一個類的實例,但由于Int類型轉(zhuǎn)換成了NSNumber類,Int類型屬于AnyObject類型的。因此,你可以將一個Int[]類型的Swift數(shù)組轉(zhuǎn)換為NSArray對象。如果 Swift 數(shù)組里的一個元素不屬于AnyObject類型,那么在運行時就會產(chǎn)生錯誤。
你也可以從 Swift 數(shù)組中創(chuàng)建一個NSArray對象。當(dāng)你將一個常量或變量定義為一個NSArray對象并分配一個數(shù)組給它作為實例變量時,Swift 將會創(chuàng)建一個NSArray對象,而不是一個 Swift 數(shù)組。
  1. let schoolSupplies: NSArray = ["Pencil", "Eraser", "Notebkko"] 
  2. // schoolSupplies is an NSArray object containing NSString objects 
上面的例子中,Swift 數(shù)組包含包含三個String字符串。由于從String類型轉(zhuǎn)換為NSString類,數(shù)組字面量被轉(zhuǎn)換成一個NSArray對象,并成功分配給schoolSupplies變量。
當(dāng)您在 Objective-C 代碼中使用 Swift 類或者協(xié)議時,接入的API會將全部所有類型的Swift數(shù)組代替為NSArray。若您將一個NSArray對象傳遞給Swift的API并要求數(shù)組元素為一個新的類型,運行時就會產(chǎn)生錯誤。如果 Swift API 返回一個不能被轉(zhuǎn)換為NSArray類型的 Swift 數(shù)組,錯誤也會產(chǎn)生。
字典
敬請期待
Foundation數(shù)據(jù)類型
Swift 也提供一種簡單便捷的覆蓋方法來連接定義在 Foundation 框架中的數(shù)據(jù)類型。在NSSize和NSPoint中使用覆蓋方法,在剩下的 Swift 語言中,你能在它的句法中感受到自然和統(tǒng)一。比如,你可以使用如下語法創(chuàng)建一個NSSize類型的結(jié)構(gòu):
  1. let size = NSSize(width: 20, height: 40) 
覆蓋方法也允許你以一種自然的方式調(diào)用 Foundation 的結(jié)構(gòu)函數(shù)。
  1. let rect = NSRect(x: 50, y: 50, width: 100, height: 100) 
  2. let width = rect.width    // equivalent of NSWidth(rect) 
  3. let maxX = rect.maxY      // equivalent of NSMaxY(rect) 
Swift可以將NSUInteger和NSInteger轉(zhuǎn)換為Int類型。這些類型都會在 Foundation APIs 中變?yōu)镮nt類型。在 Swift 中Int常被盡可能地用以連貫性,同時當(dāng)你要求一個無符號整數(shù)類型時,UInt類型總是可使用的。
Foundation函數(shù)
在 Swift 中,NSLog可在系統(tǒng)控制臺輸出信息。您可以像在 Objective-C 中使用過的語法格式那樣使用此函數(shù)。
  1. NSLog("%.7f", pi)         // Logs "3.1415927" to the console 
同時,Swift 也提供像print和println那樣的輸出函數(shù)。這些函數(shù)簡單,粗暴,多效,多歸于 Swift 的字符插入法。這些函數(shù)不會在系統(tǒng)控制臺輸出信息,但在需要的時候卻是存在可用的。
Swift 中不再存在NSAssert函數(shù),取而代之的是assert函數(shù)。
Core Foundation
Swift中的 Core Foundation 類型是一個成熟的類。當(dāng)出現(xiàn)內(nèi)存管理注釋時,Swift 會自動地管理 Core Foundation 對象的內(nèi)存,這其中包括你實例化了的 Core Foundation 對象。在 Swift 中,你可以自由變換 Fundation 和 Core Foundation 類型。如果你想先轉(zhuǎn)換為橋接 Foundation 類型時,你也可以橋接一些 toll-free bridged Core Foundation 類型到 Swift 標(biāo)準(zhǔn)庫類型。
重定義類型
當(dāng) Swift 導(dǎo)入 Core Foundation 類型時,編譯器會重映射導(dǎo)入的類型名字。編譯器會從每個類型名字的末端移除Ref,這是因為所有的 Swift 類都屬于引用類型,因此后綴是多余的。
Core Foundation 中的CFTypeRef類型會對Anyobject類型重映射。所以你以前使用的CFTypeRef,現(xiàn)在該換成AnyObject了。
內(nèi)存管理對象
在 Swift 中,從 annotated APIs 返回的 Core Foundation 對象能夠自動進(jìn)行內(nèi)存管理--你不再需要調(diào)用自身的CFRetain,CFRelease,或者CFAutorelease函數(shù)。如果你從自身的C函數(shù)和 Objective-C 方法中返回一個 Core Foundation 對象,你需要用CF_RETURNS_RETAINED或者CF_RETURNS_NOT_RETAINED注釋這個對象。當(dāng) Swift 代碼中包含這些 APIs 時,編譯器會在編譯時自動調(diào)用內(nèi)存管理。如果你只調(diào)用那些不會間接返回 Core Foundation 對象的 annotated APIs,那么現(xiàn)在你可以跳過本節(jié)的剩余部分了。否則,讓我們繼續(xù)學(xué)習(xí)那些難管理的 Core Foundation 對象吧。
非托管對象
當(dāng) Swift 導(dǎo)入還尚未被注釋的APIs時,編譯器將不會自動地對返回的 Core Foundation 對象進(jìn)行內(nèi)存管理。Swift 將這些返回的 Core Foundation 對象封閉在一個Unmanaged<T>結(jié)構(gòu)中。那些間接返回 Core Foundation 的對象也是難以管理的。舉個例子,這里有一個 unannotated 的 C 函數(shù):
  1. CFStringRef StringByAddingTwoStrings(CFStringRef string1, CFStringRef string2) 
這里說明了Swift是怎么導(dǎo)入的:
  1. func StringByAddingTwoStrings(CFString!, CFString!) -> Unmanaged<CFString>! 
假設(shè)您從 unannotated APIs 接收了一個難以管理的對象,在使用它之前,你必須要將它轉(zhuǎn)換為一個能夠內(nèi)存管理的對象。在這方面,Swift 可以幫你進(jìn)行內(nèi)存管理而不用自己動手。同時,Unmanaged<T>結(jié)構(gòu)也提供了兩個方法來把一個難以管理的對象轉(zhuǎn)換為一個可內(nèi)存管理的對象--takeUnretainedValue()方法和takeRetainedValue()方法。這兩個方法會返回原始的,開放的對象類型。您可以根據(jù)您實際調(diào)用的APIs返回的unretained或retained的對象,來選擇哪一方法更合適。
比如,假設(shè)這里有一個 C 函數(shù),這個函數(shù)在返回值前不會釋放CFString對象。在使用這個對象前,您使用takeUnretainedValue()函數(shù),以將它轉(zhuǎn)換為一個能夠內(nèi)存管理的對象。
  1. let memoryManagedResult = StringByAddingTwoStrings(str1, str2).takeUnretainedValue() 
  2. // memoryManagedResult is a memory managed CFString 
您也可以在一個非托管的對象中使用retain(),release()和autorelease()方法,但是這種做法并不值得推薦。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
swift 簡單使用
Foundation框架——————集合
塊代碼實用入門指南
Swift編程語言中文教程(十八):Swift類型轉(zhuǎn)換
Objective
nil Nil NULL NSNull 之間的區(qū)別
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服