欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Swift使用Cocoa中的數(shù)據(jù)類(lèi)型教程

 更新時(shí)間:2014年07月21日 10:12:00   投稿:junjie  
這篇文章主要介紹了Swift使用Cocoa中的數(shù)據(jù)類(lèi)型教程,Swift 會(huì)自動(dòng)將一些 Objective-C 類(lèi)型轉(zhuǎn)換為 Swift 類(lèi)型,以及將 Swift 類(lèi)型轉(zhuǎn)換為 Objective-C 類(lèi)型,需要的朋友可以參考下

作為對(duì) Objective-C 互用性(互操作性)的一部分,Swift提供快捷高效的方式來(lái)處理Cocoa數(shù)據(jù)類(lèi)型。

Swift 會(huì)自動(dòng)將一些 Objective-C 類(lèi)型轉(zhuǎn)換為 Swift 類(lèi)型,以及將 Swift 類(lèi)型轉(zhuǎn)換為 Objective-C 類(lèi)型。在 Objective-C 和 Swift 中也有一些具有互用性的數(shù)據(jù)類(lèi)型。那些可轉(zhuǎn)換的數(shù)據(jù)類(lèi)型或者具有互用性的數(shù)據(jù)類(lèi)型被稱(chēng)為bridged數(shù)據(jù)類(lèi)型。舉個(gè)例子,在 Swift 中,您可以將一個(gè)Array值傳遞給一個(gè)要求為NSArray對(duì)象的方法。你也可以轉(zhuǎn)換一個(gè) bridged 類(lèi)型和它的副本。當(dāng)你使用as轉(zhuǎn)換 bridged 類(lèi)型或者那些由常量和變量所提供的類(lèi)型時(shí),Swift 會(huì)橋接它們的數(shù)據(jù)類(lèi)型。

Swift 也提供一種簡(jiǎn)單便捷的覆蓋方法來(lái)連接 Foundation 的數(shù)據(jù)類(lèi)型,在后面的 Swift 語(yǔ)言中,你能在它的句法中感受到自然和統(tǒng)一。

字符串

Swift會(huì)在String類(lèi)型和NSString類(lèi)型中自動(dòng)轉(zhuǎn)換。這意味著在可以使用NSString對(duì)象的地方,您可以使用一個(gè)屬于 Swift 的String類(lèi)型代替它,這樣做會(huì)同時(shí)擁有它們數(shù)據(jù)類(lèi)型的特點(diǎn),String類(lèi)型的插值,基于Swift設(shè)計(jì)的APIs以及NSString類(lèi)更廣的適用范圍。因此,您幾乎不必再在你的代碼中使用NSString類(lèi)。事實(shí)上,當(dāng) Swift 接入 Objective-C APIs 時(shí),它將把所有NSString類(lèi)型替換為String類(lèi)型。當(dāng)您在您的Objective-C代碼中使用 Swift 類(lèi)時(shí),接入的API會(huì)將所有String類(lèi)型替換成NSString類(lèi)型。

為了允許字符串轉(zhuǎn)換,只需接入Foundation。舉個(gè)例子,您在 Swift 的一個(gè)字符串中調(diào)用了capitalizedString--一個(gè)NSString類(lèi)的方法,此后 Swift 會(huì)自動(dòng)將String轉(zhuǎn)換為一個(gè)NSString對(duì)象并調(diào)用方法。這個(gè)方法甚至?xí)祷匾粋€(gè) Swift 的String類(lèi)型,因?yàn)樗诮尤氲臅r(shí)候被替換了。

復(fù)制代碼 代碼如下:

import Foundation
let greeting = "hello, world!"
let capitalizedGreeting = greeting.capitalizedString
// capitalizedGreeting: String = Hello, World!

如果您確實(shí)需要用到一個(gè)NSString對(duì)象,您可以用一個(gè) Swift 的String值并轉(zhuǎn)換它。String類(lèi)型總是可以從一個(gè)NSString對(duì)象轉(zhuǎn)換為一個(gè)Swift的String的值,因此,再?zèng)]有必要去使用一個(gè)可選的類(lèi)型轉(zhuǎn)換器()as?)。您也可以再一個(gè)字符串中通過(guò)定義常量和變量來(lái)創(chuàng)建一個(gè)NSString對(duì)象。

復(fù)制代碼 代碼如下:

import Foundation
let myString: NSString = "123"
if let integerValue = (myString as String).toInt()){
    println("\(myString) is the integer \(integerValue)")
}

本地化

在Objective-C中,常用NSLocalizedString類(lèi)的宏來(lái)定位一個(gè)字符串。這集合的宏包括NSLocalizedStringFromTableInBundle和NSLocalizedStringWithDefaultValue。而在Swift中,只用一個(gè)函數(shù)就可以實(shí)現(xiàn)跟整個(gè)NSLocalizedString集一樣的功能,即NSLocalizedString(key:tableName:bundle:value:comment:)。這個(gè)NSLocalizedString函數(shù)分別為tableName,bundle和value參數(shù)提供了一個(gè)默認(rèn)值。你可以用它來(lái)替換宏。

數(shù)字

Swift會(huì)自動(dòng)將已確定的數(shù)字類(lèi)型Int和Float轉(zhuǎn)換為NSNumber。這樣的轉(zhuǎn)換允許你基于其中一種類(lèi)型創(chuàng)建一個(gè)NSNumber:

復(fù)制代碼 代碼如下:

let n = 42
let m: NSNumber = n

你也能傳遞一個(gè)Int類(lèi)型的值,比如傳遞給一個(gè)要求為NSNumber類(lèi)型的參數(shù)。同時(shí)需要注意的是,NSNumber可以包含多種不同的類(lèi)型,因此您不能把它傳遞給單一的一個(gè)Int值。

下面所列出的類(lèi)型都會(huì)自動(dòng)轉(zhuǎn)換為NSNumber:

復(fù)制代碼 代碼如下:
Int
UInt
Float
Double
Bool

類(lèi)集合

Swift 會(huì)自動(dòng)將NSArray和NSDictionary類(lèi)轉(zhuǎn)換為Swift里等價(jià)的類(lèi)。這意味著你將受益于Swift強(qiáng)大的算法和得天獨(dú)厚的語(yǔ)法來(lái)處理集合--可互相轉(zhuǎn)換的 Foundation 和 Swift 集合類(lèi)型。

數(shù)組

Swift 會(huì)在Array類(lèi)型和NSArray類(lèi)型中自動(dòng)轉(zhuǎn)換。當(dāng)你從一個(gè) Swift 數(shù)組轉(zhuǎn)換到一個(gè)NSArray對(duì)象,轉(zhuǎn)換后的數(shù)組是一個(gè)AnyObject[]類(lèi)型的數(shù)組。如果某個(gè)對(duì)象是 Objective-C 或者 Swift 類(lèi)的實(shí)例,或者這個(gè)對(duì)象可以轉(zhuǎn)換成另一種類(lèi)型,那么這個(gè)對(duì)象則屬于AnyObject類(lèi)型的對(duì)象。你可以將任一NSArray對(duì)象轉(zhuǎn)換成一個(gè) Swift 數(shù)組,因?yàn)樗?Objective-C 的對(duì)象都是AnyObject類(lèi)型的。正因如此,Swift 的編譯器會(huì)在接入 Objective-C APIs 的時(shí)候?qū)SArray類(lèi)替換成AnyObject[]。

當(dāng)你將一個(gè)NSArray對(duì)象轉(zhuǎn)換成一個(gè) Swift 數(shù)組后,你也可以將數(shù)組強(qiáng)制類(lèi)型轉(zhuǎn)換成一個(gè)特定的類(lèi)型。與從NSArray類(lèi)轉(zhuǎn)換到AnyObject[]不同的是,從AnyObject類(lèi)型的對(duì)象轉(zhuǎn)換成明確的類(lèi)型并不會(huì)保證成功。由于直到運(yùn)行時(shí)編譯器才知道AnyObject的對(duì)象能否被強(qiáng)制轉(zhuǎn)換為特定的類(lèi)型,因此,從AnyObject[]轉(zhuǎn)換為SomeType[]會(huì)返回一個(gè)optional的值。舉個(gè)例子,如果你知道一個(gè)Swift數(shù)組只包含UIView類(lèi)的實(shí)例(或者一個(gè)UIView類(lèi)的子類(lèi)),你可以將AnyObject類(lèi)型的數(shù)組元素強(qiáng)制轉(zhuǎn)換為UIView對(duì)象。如果Swift數(shù)組中得元素在運(yùn)行時(shí)不是UIView類(lèi)型的對(duì)象,那么轉(zhuǎn)換則會(huì)返回nil。

復(fù)制代碼 代碼如下:

let swiftyArray = foundationArray as AnyObject[]
if let downcastedSwiftArray = swiftArray as? UIView[] {
    // downcastedSwiftArray contains only UIView objects
}

你也可以在for循環(huán)中將NSArray對(duì)象定向地強(qiáng)制轉(zhuǎn)換為特定類(lèi)型的Swift數(shù)組:

復(fù)制代碼 代碼如下:

for aView: UIView! in foundationArray {
     // aView is of type UIView
}

注意:這種轉(zhuǎn)換是強(qiáng)制轉(zhuǎn)換,如果轉(zhuǎn)換不成功則會(huì)在運(yùn)行時(shí)產(chǎn)生錯(cuò)誤信息。

當(dāng)你從 Swift 數(shù)組轉(zhuǎn)換為NSArray對(duì)象時(shí),Swift 數(shù)組里的元素必須是屬于AnyObject的。例如,一個(gè)Int[]類(lèi)型的 Swift 數(shù)組包含Int結(jié)構(gòu)的元素。Int類(lèi)型并不是一個(gè)類(lèi)的實(shí)例,但由于Int類(lèi)型轉(zhuǎn)換成了NSNumber類(lèi),Int類(lèi)型屬于AnyObject類(lèi)型的。因此,你可以將一個(gè)Int[]類(lèi)型的Swift數(shù)組轉(zhuǎn)換為NSArray對(duì)象。如果 Swift 數(shù)組里的一個(gè)元素不屬于AnyObject類(lèi)型,那么在運(yùn)行時(shí)就會(huì)產(chǎn)生錯(cuò)誤。

你也可以從 Swift 數(shù)組中創(chuàng)建一個(gè)NSArray對(duì)象。當(dāng)你將一個(gè)常量或變量定義為一個(gè)NSArray對(duì)象并分配一個(gè)數(shù)組給它作為實(shí)例變量時(shí),Swift 將會(huì)創(chuàng)建 NSArray對(duì)象,而不是 Swift 數(shù)組。

復(fù)制代碼 代碼如下:

let schoolSupplies: NSArray = ["Pencil", "Eraser", "Notebkko"]
// schoolSupplies is an NSArray object containing NSString objects

上面的例子中,Swift 數(shù)組包含包含三個(gè)String字符串。由于從String類(lèi)型轉(zhuǎn)換為NSString類(lèi),數(shù)組字面量被轉(zhuǎn)換成一個(gè)NSArray對(duì)象,并成功分配給schoolSupplies變量。

當(dāng)您在 Objective-C 代碼中使用 Swift 類(lèi)或者協(xié)議時(shí),接入的API會(huì)將全部所有類(lèi)型的Swift數(shù)組代替為NSArray。若您將一個(gè)NSArray對(duì)象傳遞給Swift的API并要求數(shù)組元素為一個(gè)新的類(lèi)型,運(yùn)行時(shí)就會(huì)產(chǎn)生錯(cuò)誤。如果 Swift API 返回一個(gè)不能被轉(zhuǎn)換為NSArray類(lèi)型的 Swift 數(shù)組,錯(cuò)誤也會(huì)隨之產(chǎn)生。

Foundation數(shù)據(jù)類(lèi)型

Swift 也提供一種簡(jiǎn)單便捷的覆蓋方法來(lái)連接定義在 Foundation 框架中的數(shù)據(jù)類(lèi)型。在NSSize和NSPoint中使用覆蓋方法,在剩下的 Swift 語(yǔ)言中,你能在它的句法中感受到自然和統(tǒng)一。比如,你可以使用如下語(yǔ)法創(chuàng)建一個(gè)NSSize類(lèi)型的結(jié)構(gòu):

復(fù)制代碼 代碼如下:

let size = NSSize(width: 20, height: 40)

覆蓋方法也允許你以一種自然的方式調(diào)用 Foundation 的結(jié)構(gòu)函數(shù)。

復(fù)制代碼 代碼如下:

let rect = NSRect(x: 50, y: 50, width: 100, height: 100)
let width = rect.width // equivalent of NSWidth(rect)
let maxX = rect.maxY // equivalent of NSMaxY(rect)

Swift可以將NSUInteger和NSInteger轉(zhuǎn)換為Int類(lèi)型。這些類(lèi)型都會(huì)在 Foundation APIs 中變?yōu)镮nt類(lèi)型。在 Swift 中Int常被盡可能地用以連貫性,同時(shí)當(dāng)你要求一個(gè)無(wú)符號(hào)整數(shù)類(lèi)型時(shí),UInt類(lèi)型總是可使用的。

Foundation函數(shù)

在 Swift 中,NSLog可在系統(tǒng)控制臺(tái)輸出信息。您可以像在 Objective-C 中使用過(guò)的語(yǔ)法格式那樣使用此函數(shù)。

復(fù)制代碼 代碼如下:

NSLog("%.7f", pi)  // Logs "3.1415927" to the console

同時(shí),Swift 也提供像print和println那樣的輸出函數(shù)。多歸于 Swift 的字符插值機(jī)制才讓這些函數(shù)簡(jiǎn)單,粗暴,多效。這些函數(shù)不會(huì)在系統(tǒng)控制臺(tái)輸出信息,但在需要調(diào)用的時(shí)候卻是可用的。

Swift 中不再存在NSAssert函數(shù),取而代之的是assert函數(shù)。

Core Foundation

Swift中的 Core Foundation 類(lèi)型是一個(gè)成熟的類(lèi)。當(dāng)出現(xiàn)內(nèi)存管理注釋時(shí),Swift 會(huì)自動(dòng)地管理 Core Foundation 對(duì)象的內(nèi)存,這其中包括你實(shí)例化了的 Core Foundation 對(duì)象。在 Swift 中,你可以自由變換 Fundation 和 Core Foundation 類(lèi)型。如果你想先轉(zhuǎn)換為橋接 Foundation 類(lèi)型時(shí),你也可以橋接一些 toll-free bridged Core Foundation 類(lèi)型到 Swift 標(biāo)準(zhǔn)庫(kù)類(lèi)型。

重定義類(lèi)型

當(dāng) Swift 導(dǎo)入 Core Foundation 類(lèi)型時(shí),編譯器會(huì)重映射導(dǎo)入的類(lèi)型名字。編譯器會(huì)從每個(gè)類(lèi)型名字的末端移除Ref,這是因?yàn)樗械?Swift 類(lèi)都屬于引用類(lèi)型,因此后綴是多余的。

Core Foundation 中的CFTypeRef類(lèi)型會(huì)對(duì)Anyobject類(lèi)型重映射。所以你以前使用的CFTypeRef,現(xiàn)在該換成AnyObject了。

內(nèi)存管理對(duì)象

在 Swift 中,從 annotated APIs 返回的 Core Foundation 對(duì)象能夠自動(dòng)進(jìn)行內(nèi)存管理--你不再需要調(diào)用自身的CFRetain,CFRelease,或者CFAutorelease函數(shù)。如果你從自身的C函數(shù)和 Objective-C 方法中返回一個(gè) Core Foundation 對(duì)象,你需要用CF_RETURNS_RETAINED或者CF_RETURNS_NOT_RETAINED注釋這個(gè)對(duì)象。當(dāng) Swift 代碼中包含這些 APIs 時(shí),編譯器會(huì)在編譯時(shí)自動(dòng)調(diào)用內(nèi)存管理。如果你只調(diào)用那些不會(huì)間接返回 Core Foundation 對(duì)象的 annotated APIs,那么現(xiàn)在你可以跳過(guò)本節(jié)的剩余部分了。否則,下面我們繼續(xù)學(xué)習(xí)非托管的 Core Foundation 對(duì)象。

非托管對(duì)象

當(dāng) Swift 導(dǎo)入 unannotated 的APIs時(shí),編譯器將不會(huì)自動(dòng)地對(duì)返回的 Core Foundation 對(duì)象進(jìn)行內(nèi)存管理托管。Swift 將這些返回的 Core Foundation 對(duì)象封閉在一個(gè)Unmanaged<T>結(jié)構(gòu)中。那些間接返回 Core Foundation 的對(duì)象也是非托管的。舉個(gè)例子,這里有一個(gè) unannotated 的 C 函數(shù):

復(fù)制代碼 代碼如下:

CFStringRef StringByAddingTwoStrings(CFStringRef string1, CFStringRef string2)

這里說(shuō)明了Swift是怎么導(dǎo)入的:

復(fù)制代碼 代碼如下:

func StringByAddingTwoStrings(CFString!, CFString!) -> Unmanaged<CFString>!

假設(shè)您從 unannotated APIs 接收了非托管的對(duì)象,在使用它之前,你必須將它轉(zhuǎn)換為能夠內(nèi)存管理的對(duì)象。在這方面,Swift 可以幫你進(jìn)行內(nèi)存管理而不用自己動(dòng)手。同時(shí),Unmanaged<T>結(jié)構(gòu)也提供了兩個(gè)方法來(lái)把一個(gè)非托管對(duì)象轉(zhuǎn)換為一個(gè)可內(nèi)存管理的對(duì)象--takeUnretainedValue()方法和takeRetainedValue()方法。這兩個(gè)方法會(huì)返回原始的,非封閉的對(duì)象類(lèi)型。您可以根據(jù)您實(shí)際調(diào)用的APIs返回的unretained或retained的對(duì)象,來(lái)選擇哪一方法更合適。

比如,假設(shè)這里有一個(gè) C 函數(shù),這個(gè)函數(shù)在返回值前不會(huì)釋放CFString對(duì)象。在使用這個(gè)對(duì)象前,您使用takeUnretainedValue()函數(shù),以將它轉(zhuǎn)換為一個(gè)能夠內(nèi)存管理托管的對(duì)象。

復(fù)制代碼 代碼如下:

let memoryManagedResult = StringByAddingTwoStrings(str1, str2).takeUnretainedValue()
// memoryManagedResult is a memory managed CFString

您也可以在一個(gè)非托管的對(duì)象中使用retain(),release()和autorelease()方法,但是這種做法并不值得推薦。

相關(guān)文章

  • Swift教程之基本運(yùn)算符詳解

    Swift教程之基本運(yùn)算符詳解

    這篇文章主要介紹了Swift教程之基本運(yùn)算符詳解,本文講解了賦值運(yùn)算符、數(shù)學(xué)運(yùn)算符、取余運(yùn)算符、浮點(diǎn)余數(shù)計(jì)算、自增和自減運(yùn)算符等,需要的朋友可以參考下
    2015-01-01
  • swift實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器

    swift實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了swift實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Swift中 !和 ?的區(qū)別及使用

    Swift中 !和 ?的區(qū)別及使用

    這篇文章主要介紹了Swift中 !和 ?的區(qū)別及使用的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • Swift?重構(gòu)重載運(yùn)算符示例解析

    Swift?重構(gòu)重載運(yùn)算符示例解析

    這篇文章主要為大家介紹了Swift?重構(gòu)重載運(yùn)算符示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • 解析Swift中的泛型支持與使用

    解析Swift中的泛型支持與使用

    支持泛型意味著可以在規(guī)定參數(shù)類(lèi)型的情況下更靈活地編寫(xiě)程序,也是Swift語(yǔ)言先進(jìn)而又強(qiáng)大的體現(xiàn),這里我們就來(lái)解析Swift中的泛型支持與使用:
    2016-07-07
  • 因?yàn)橐粋€(gè)Crash引發(fā)對(duì)Swift構(gòu)造器的思考分析

    因?yàn)橐粋€(gè)Crash引發(fā)對(duì)Swift構(gòu)造器的思考分析

    這篇文章主要給大家介紹了關(guān)于因?yàn)橐粋€(gè)Crash引發(fā)對(duì)Swift構(gòu)造器的思考分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Swift具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Swift中的可選項(xiàng)Optional解包方式實(shí)現(xiàn)原理

    Swift中的可選項(xiàng)Optional解包方式實(shí)現(xiàn)原理

    這篇文章主要為大家介紹了Swift中的可選項(xiàng)Optional解包方式實(shí)現(xiàn)原理示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Swift 3.0基礎(chǔ)學(xué)習(xí)之閉包

    Swift 3.0基礎(chǔ)學(xué)習(xí)之閉包

    Swift引進(jìn)了閉包的概念,這個(gè)與object-c的block類(lèi)似,使用過(guò)block的話都知道有多方便,所以開(kāi)始學(xué)Swift,先要把閉包學(xué)會(huì),后面使用會(huì)很頻繁。下面這篇文章主要介紹了Swift 3.0基礎(chǔ)學(xué)習(xí)之閉包的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-03-03
  • Swift使用WKWebView在iOS應(yīng)用中調(diào)用Web的方法詳解

    Swift使用WKWebView在iOS應(yīng)用中調(diào)用Web的方法詳解

    這篇文章主要介紹了Swift使用WKWebView在iOS應(yīng)用中調(diào)用Web的方法詳解,使用WKWebView便等于使用和Safari中相同的JavaScript解釋器,用來(lái)替代過(guò)去的UIWebView,需要的朋友可以參考下
    2016-04-04
  • Swift在控件中添加點(diǎn)擊手勢(shì)的方法

    Swift在控件中添加點(diǎn)擊手勢(shì)的方法

    這篇文章主要介紹了Swift在控件中添加點(diǎn)擊手勢(shì)的方法,本文講解如何在tableview的headerview中添加點(diǎn)擊手勢(shì)的方法,需要的朋友可以參考下
    2015-01-01

最新評(píng)論