亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Swift > 正文

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

2020-03-09 17:52:16
字體:
來源:轉載
供稿:網(wǎng)友
這篇文章主要介紹了Swift使用Cocoa中的數(shù)據(jù)類型教程,Swift 會自動將一些 Objective-C 類型轉換為 Swift 類型,以及將 Swift 類型轉換為 Objective-C 類型,需要的朋友可以參考下
 

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

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

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

字符串

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

為了允許字符串轉換,只需接入Foundation。舉個例子,您在 Swift 的一個字符串中調(diào)用了capitalizedString--一個NSString類的方法,此后 Swift 會自動將String轉換為一個NSString對象并調(diào)用方法。這個方法甚至會返回一個 Swift 的String類型,因為它在接入的時候被替換了。

復制代碼代碼如下:

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

 

如果您確實需要用到一個NSString對象,您可以用一個 Swift 的String值并轉換它。String類型總是可以從一個NSString對象轉換為一個Swift的String的值,因此,再沒有必要去使用一個可選的類型轉換器()as?)。您也可以再一個字符串中通過定義常量和變量來創(chuàng)建一個NSString對象。

復制代碼代碼如下:

import Foundation
let myString: NSString = "123"
if let integerValue = (myString as String).toInt()){
    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ù)提供了一個默認值。你可以用它來替換宏。

數(shù)字

Swift會自動將已確定的數(shù)字類型Int和Float轉換為NSNumber。這樣的轉換允許你基于其中一種類型創(chuàng)建一個NSNumber:

復制代碼代碼如下:

let n = 42
let m: NSNumber = n 

 

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

下面所列出的類型都會自動轉換為NSNumber:

復制代碼代碼如下:
Int
UInt
Float
Double
Bool

 

類集合

Swift 會自動將NSArray和NSDictionary類轉換為Swift里等價的類。這意味著你將受益于Swift強大的算法和得天獨厚的語法來處理集合--可互相轉換的 Foundation 和 Swift 集合類型。

數(shù)組

Swift 會在Array類型和NSArray類型中自動轉換。當你從一個 Swift 數(shù)組轉換到一個NSArray對象,轉換后的數(shù)組是一個AnyObject[]類型的數(shù)組。如果某個對象是 Objective-C 或者 Swift 類的實例,或者這個對象可以轉換成另一種類型,那么這個對象則屬于AnyObject類型的對象。你可以將任一NSArray對象轉換成一個 Swift 數(shù)組,因為所有 Objective-C 的對象都是AnyObject類型的。正因如此,Swift 的編譯器會在接入 Objective-C APIs 的時候?qū)SArray類替換成AnyObject[]。

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

 

復制代碼代碼如下:

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

 

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

 

復制代碼代碼如下:

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

 

注意:這種轉換是強制轉換,如果轉換不成功則會在運行時產(chǎn)生錯誤信息。

當你從 Swift 數(shù)組轉換為NSArray對象時,Swift 數(shù)組里的元素必須是屬于AnyObject的。例如,一個Int[]類型的 Swift 數(shù)組包含Int結構的元素。Int類型并不是一個類的實例,但由于Int類型轉換成了NSNumber類,Int類型屬于AnyObject類型的。因此,你可以將一個Int[]類型的Swift數(shù)組轉換為NSArray對象。如果 Swift 數(shù)組里的一個元素不屬于AnyObject類型,那么在運行時就會產(chǎn)生錯誤。

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

復制代碼代碼如下:

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

 

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

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

Foundation數(shù)據(jù)類型

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

復制代碼代碼如下:

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

 

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

復制代碼代碼如下:

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轉換為Int類型。這些類型都會在 Foundation APIs 中變?yōu)镮nt類型。在 Swift 中Int常被盡可能地用以連貫性,同時當你要求一個無符號整數(shù)類型時,UInt類型總是可使用的。

Foundation函數(shù)

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

 

復制代碼代碼如下:

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

 

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

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

Core Foundation

Swift中的 Core Foundation 類型是一個成熟的類。當出現(xiàn)內(nèi)存管理注釋時,Swift 會自動地管理 Core Foundation 對象的內(nèi)存,這其中包括你實例化了的 Core Foundation 對象。在 Swift 中,你可以自由變換 Fundation 和 Core Foundation 類型。如果你想先轉換為橋接 Foundation 類型時,你也可以橋接一些 toll-free bridged Core Foundation 類型到 Swift 標準庫類型。

重定義類型

當 Swift 導入 Core Foundation 類型時,編譯器會重映射導入的類型名字。編譯器會從每個類型名字的末端移除Ref,這是因為所有的 Swift 類都屬于引用類型,因此后綴是多余的。

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

內(nèi)存管理對象

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

非托管對象

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

復制代碼代碼如下:

CFStringRef StringByAddingTwoStrings(CFStringRef string1, CFStringRef string2) 

 

這里說明了Swift是怎么導入的:

復制代碼代碼如下:

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

 

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

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

 

復制代碼代碼如下:

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

 

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



注:相關教程知識閱讀請移步到swift教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
日本美女一级片| 91免费观看视频| 亚洲欧洲一区二区在线播放| www.av99| 一区二区视频在线观看| 精品久久久久久久久久| 大桥未久一区二区三区| 欧美色图亚洲自拍| 麻豆av一区二区| 亚洲国产成人在线观看| 美女的尿口免费视频| 亚洲精品xxxxx| 污视频免费在线看| 在线视频播放大全| 日本aa大片在线播放免费看| 久久精品视频在线观看免费| 亚洲一区二区成人在线观看| 伪装者免费全集在线观看| 可以免费看av的网址| 国产丝袜精品第一页| 国产精品久久久久久久久快鸭| 亚洲精品国产setv| 亚洲一区二区三区蜜桃| 国产免费观看av| 日本一区二区黄色| 成人免费一区二区三区视频| 成年人视频在线免费观看| 国产精品天干天干在线综合| 激情小说中文字幕| 天涯成人国产亚洲精品一区av| 国产黄色免费大片| 亚洲素人一区二区| 亚洲字幕成人中文在线观看| 一区二区三区四区在线观看视频| 午夜无码国产理论在线| 日本在线аv| 日本免费不卡视频| 少妇性色午夜淫片aaa播放| 一区二区成人网| 欧美成人一区二区三区四区| 男女啪啪无遮挡| 亚洲综合色网| jiyouzz国产精品久久| 黄色一级大片在线免费看国产| 992tv在线影院| 亚洲av永久无码国产精品久久| 日韩精品在线网站| 麻豆91精品91久久久| 久久免费99精品久久久久久| 亚洲精品国产一区二区三区| 在线成年人视频| 国产传媒av在线| 99久久免费看精品国产一区| 中文字幕在线观看一区| 亚洲娇小xxxx欧美娇小| 久久蜜桃av一区二区天堂| 四虎影视永久免费在线观看一区二区三区| 欧美日韩国产经典色站一区二区三区| 久久一日本道色综合| 国风产精品一区二区| 精品96久久久久久中文字幕无| 日本a级c片免费看三区| 国产无套粉嫩白浆内谢的出处| 欧美一区二区三区人| 久久久久久久久久久久久久免费看| 久久久www免费人成黑人精品| 国产日产欧美a一级在线| 亚洲欧美大片| 欧美一级二级三级| 亚洲国产欧美一区二区丝袜黑人| 91在线免费视频| 成人激情开心网| 成人爱爱网址| 亚洲视频第一页| 超碰国产精品一区二页| 天海翼一区二区三区四区在线观看| 亚洲人被黑人高潮完整版| 国产情侣小视频| 天堂一区二区在线| 国产熟女一区二区丰满| 四虎成人永久免费视频| 日本小视频网站| 国产高清不卡av| 柠檬福利视频导航| 国产欧美一区二区精品仙草咪| 一区高清视频| 性欧美ⅴideo另类hd| 中文乱码人妻一区二区三区视频| 国产日产欧美一区二区| 国产在线播放一区二区| 最新日韩av| 91网站在线看| 成人3d动漫网站| 精品久久久久久一区二区里番| 青青青手机在线视频| 亚洲一卡久久| 视频一区日韩精品| 成人国产精品免费观看动漫| 日韩av不卡在线| 国产精品臀控福利在线观看| 美媛馆国产精品一区二区| 国产精品人人做人人爽人人添| 韩国三级在线观看久| 成人h片在线播放免费网站| 日韩国产激情在线| а√天堂8资源在线| 久久欧美中文字幕| 国产厕所精品在线观看| 国产乱码精品一区二区三区不卡| 久久大逼视频| 日韩美女主播在线视频一区二区三区| 国产精品亚洲综合天堂夜夜| 成人亚洲精品777777大片| 国产成人精品av久久| 大地资源高清在线视频观看| 亚洲欧美日韩在线一区| 国产精品资源| 国产偷亚洲偷欧美偷精品| 欧美性猛交xxxx乱大交极品| 亚洲三级在线观看| 欧美国产日韩在线观看成人| 久久久在线视频| 亚洲а∨天堂久久精品2021| 日韩美女免费线视频| 国产三级免费观看| 最新国产精品久久久| 亚洲一区二区三区四区五区黄| 国产又粗又猛视频| 成人精品视频一区二区三区尤物| 欧美精品18videosex性欧美| 两个人看的在线视频www| 欧美日韩一区小说| 国产精品久久中文| 国产精品无码久久久久久| 久久久久久久久福利| 中文字幕日本乱码精品影院| 男人添女人下部高潮视频在线观看| 久草综合在线视频| 国产精品探花一区二区在线观看| 亚洲专区中文字幕| 波多野结衣亚洲色图| 一级黄色免费网站| 成人免费视频观看| 国内精品视频666| 国产精品一区毛片| 日本24小时在线高清视频| 欧美三级理论片| 国产一二三四| 婷婷在线免费视频| 国产日韩欧美一区二区三区乱码| 国产精品一二三| 亚洲激情 欧美| 欧美日韩精品在线一区二区| 亚洲天堂最新地址| 欧美a级一区| 亚洲第一伊人| 免费yellow网站| 欧美日本另类xxx乱大交| 日本久久天堂| 日本欧洲国产一区二区| 欧美日韩美女在线观看| 日本久久久久久久久久久| 97av视频在线观看| 欧美日韩国产色综合一二三四| 俄罗斯黄色一级片| 成人免费在线小视频| 精品女厕一区二区三区| 亚洲精品在线免费观看视频| 狠狠久久婷婷| 亚洲熟妇一区二区| 天天爽夜夜爽| xxx在线播放| av网站在线看| 国产一区二区视频在线观看| 免费自拍视频| 欧美牲交a欧美牲交aⅴ免费真| 久久高清精品| 天天夜碰日日摸日日澡| 久久久久久伊人| 毛片网站在线| 欧美熟妇交换久久久久久分类| 午夜精品久久久久| 波多野结衣一区| 欧美一级精品片在线看| 分分操这里只有精品| 日韩欧中文字幕| 亚洲性视频大全| 天天操天天干天天做| 欧美在线一区二区视频| 天堂а√在线中文在线| 国内精品久久久久久不卡影院| 中文字幕精品在线播放| 亚洲精品一区二区在线播放∴| 亚洲图片小说网| 亚洲不卡视频| 久久噜噜色综合一区二区| 一级黄色录像免费看| 三级毛片在线| 亚洲国产一区二区三区高清| 国产一级伦理片| 欧美人妻一区二区| 三级资源在线| 中文字幕导航| 99riav国产精品视频| 国模娜娜一区二区三区| 白嫩亚洲一区二区三区| 免费黄色电影在线观看| 久久亚洲精品人成综合网| 亚洲女同志亚洲女同女播放| 国产精品久久久久久久久男| www.久久视频| 日韩一级片大全| 小早川怜子一区二区三区| 免费黄色在线播放| 精品视频1区2区3区| 18岁网站在线观看| 欧美xxxxxxxxx| 免费成年人高清视频| 精品96久久久久久中文字幕无| 国产中文在线| 99免费精品视频| 中日韩脚交footjobhd| 国产视频不卡在线| 成人黄色片视频网站| 好看的日韩精品视频在线| 久久久久亚洲av成人无码电影| 五月天网站亚洲| 综合国产在线观看| 精品无吗乱吗av国产爱色| 久久精品视频网站| 欧美三级在线视频| 在线成人激情视频| 日韩国产高清在线| 欧美成人精品欧美一级私黄| 色狠狠久久av五月综合|| 亚洲日本视频在线观看| 国内精品久久久久影院优| 日韩影视在线| 国产精彩视频在线观看免费蜜芽| 国产无码精品在线观看| 热re99久久国产精品| 精品成人免费自拍视频| 成人3d动漫网站| 午夜精品视频在线观看| 老鸭窝av在线| 久草视频手机在线观看| 97精品伊人久久久大香线蕉| 亚洲欧美成人综合| 亚洲裸体俱乐部裸体舞表演av| 黄色激情网址| 免费黄色成年网站| 国产精品免费视频一区| 国产成人精品久久二区二区| 久久精品噜噜噜成人av农村| 性欧美video另类hd尤物| 91视频久色| 久久一区二区三区av| 亚洲欧美一区二区三区久久| 久久精彩视频| 一区二区三区在线视频播放| 97国产真实伦对白精彩视频8| 成年人视频在线| 少妇av一区二区三区| 亚洲一区二区三区日本久久九| 中国国产一级毛片| 亚洲另类在线视频| 久久精品影视伊人网| 99热超碰在线| 2025国产精品自拍| 午夜精品福利一区二区三区av| 亚洲精品一区二区三区在线| 欧美在线观看你懂的| 国产亚洲精品精品国产亚洲综合| 在线日韩视频| 亚洲va久久久噜噜噜无码久久| 久久精品国产av一区二区三区| 一区二区三区欧美视频| 免费麻豆国产一区二区三区四区| 欧美精品国产一区| 国产精品看片你懂得| 日日橹狠狠爱欧美超碰| 中文字幕无线码| 亚洲国产美女视频| xxxwww国产| 精久久久久久久久久久| 捆绑紧缚一区二区三区在线观看| 24小时成人在线视频| 被弄出白浆喷水了视频| 国产黄色免费电影| 欧美成人hd| h片在线观看视频| 国产精品全国免费观看高清| 丰满熟女人妻一区二区三区| 欧美乱大交xxxxx另类| 国产在线日韩在线| 中文字幕永久在线不卡| 中文字幕免费一区二区三区| 亚洲一区二区影视| 免费国产自线拍一欧美视频| 国产中文字幕二区| 免费在线精品视频| 欧美尿孔扩张虐视频| 欧美日本精品一区二区三区| 国产在线视频你懂的| a级片在线免费看| 影音先锋男人的网站| 亚洲大尺度视频| 柠檬在线导航福利| 日本高清视频免费观看| 国产精品美女午夜爽爽| 国产免费av一区二区三区| 欧美丰满老妇熟乱xxxxyyy| 欧美日韩激情在线观看| 亚洲xxx拳头交| 国产天堂第一区| 免费视频一二三区| 欧美性猛交xxxx黑人猛交| 黄色片在线播放| 高潮毛片7777777毛片| 欧美卡一卡二卡三| 日韩精彩视频| 午夜在线a亚洲v天堂网2018| 精品国产亚洲AV| 91丝袜在线观看| 伊人影院蕉久552| 亚洲视频网站在线| 国产又粗又硬又长| 国产精品乡下勾搭老头1|