iOS9 with Swift 集合類型(一)

集合類型:

Swift铲球,和其他現(xiàn)代編程語言一樣,有內(nèi)置的集合類型數(shù)組(Array)和字典(Dictionary),還增加了第三種類型集合(Set)箱沦。數(shù)組和字典非常重要以至于Swift提供了很多特殊的語法。同時(shí)像其他的大部分Swift類型雇庙,它也提供了一些相關(guān)的的函數(shù)谓形;NSArray和NSDictionary也會補(bǔ)充一些丟失的函數(shù)。而集合類型則是橋接至Cocoa的NSSet状共。

數(shù)組(Array):

數(shù)組(結(jié)構(gòu)體)是有序的對象實(shí)例的集合(數(shù)組的元素)套耕,可以使用Int類型的序號來取出元素。而且序號是從0開始的峡继。比如一個數(shù)組有四個元素冯袍,那么它就是從0到3。Swift的數(shù)組是非空的,所以如果有Index3那么就要有0—2.

最顯著的Swift數(shù)組特性是其嚴(yán)格類型檢驗(yàn)康愤。不想有些其他的語言儡循,Swift數(shù)組的元素必須統(tǒng)一,也就是說征冷,其必須是由確定的一種類型的元素所組成的择膝。即便是空數(shù)組也必須要有確定的類型。元素類型不同的兩個數(shù)組被認(rèn)為是兩種不同的類型检激,數(shù)組類型依照元素類型遵循多態(tài):如果NoisyDog是Dog的子類肴捉,那么元素是NoisyDog的數(shù)組就可以用在Dog元素?cái)?shù)組的地方。哈哈叔收,沒錯這個和可選值一樣也是泛型聲明齿穗,即Array<Element>,Element就是元素的類型饺律。

事實(shí)上數(shù)組類型同一限制窃页,可能沒有你想象的那么宴客。數(shù)組的元素必須是一種類型复濒,但是類型卻是十分領(lǐng)會的脖卖。通過選擇合適的數(shù)組類型你可以制作出實(shí)際上內(nèi)部有多種類型的數(shù)組,比如:

1巧颈、如果NoisyDog是Dog的子類畦木,那么Dog的數(shù)組就可以包含NoisyDog的元素。

2砸泛、如果Bird和Insect都采用了Flier協(xié)議馋劈,F(xiàn)lier為元素的數(shù)組就可以包含Bird或者Insect。

3晾嘶、AnyObject元素?cái)?shù)組就可以包含任何Swift的類的實(shí)例和橋接類的實(shí)例妓雾,比如Int,String垒迂、Dog械姻。

4、一種類型可能承載多個類型机断,比如枚舉類型就可以在關(guān)聯(lián)值中有Int楷拳、String等等類型。

聲明數(shù)組的類型既可以用泛型聲明:Array<Int>吏奸,也可以用語法糖聲明:[Int]欢揖。后者你會經(jīng)常使用到。

字面數(shù)組可以使用包含在方括號中的一系列被逗號分隔的元素來表示奋蔚,空數(shù)組的字面表示形式就是:[]她混。

數(shù)組的默認(rèn)構(gòu)造器init()烈钞,你可以在后面加一對空的圓括號來表示空數(shù)組:

1

如果引用量類型可以提前知道,那么該空數(shù)組可以推遲其類型坤按,因此你也可以這樣來創(chuàng)建空數(shù)組:


2

如果你用非空的字面元素來開始毯欣,那么你就不需要聲明數(shù)組的類型,因?yàn)镾wift會通過元素類型來推測出數(shù)組的類型臭脓。比如Swift會推測[1,2,3]為Int數(shù)組酗钞。如果數(shù)組包括父類和子類,那么Swift將會推測其為父類類型數(shù)組来累。甚至[1, "howdy"]這樣的數(shù)組也是可以的砚作,不過其類型是NSObject。然而在某些情況下嘹锁,即使你用字面量來聲明偎巢,你最好也現(xiàn)將引用量的類型顯式聲明:


3

數(shù)組也有參數(shù)是序列的構(gòu)造器,這就說明如果是序列類型兼耀,你就可以將它分開來充當(dāng)數(shù)組的元素。比如:

1求冷、Array(1...3)就能產(chǎn)生Int類型的數(shù)組[1,2,3]瘤运。

2、Array("hey".character)就會產(chǎn)生["h", "e","y"]匠题。

3拯坟、Array(d) 其中d是字典,就會產(chǎn)生key-value對的元組類型數(shù)組韭山。

還有一種構(gòu)造器 init(count:repeatValue:)郁季,可以用來初始化重復(fù)值。比如我要初始化一百個nil值在String钱磅?數(shù)組中梦裂。

let strings : [String?] = Array(count:100, repeatedValue: nil)

這是你在Swift中能得到的最接近于缺失數(shù)組的方法:你有100個空位可以放對象。

數(shù)組轉(zhuǎn)型和類型檢查:

當(dāng)你將一個數(shù)組分配盖淡、傳遞以及轉(zhuǎn)型到另一個數(shù)組的時(shí)候年柠,你是在每個元素的層面上去操作的:


4

這段代碼事實(shí)上是簡寫:將Int類型的數(shù)組賦給Int?類型數(shù)組褪迟,實(shí)際上是冗恨,每一個原數(shù)組中的元素都要進(jìn)行封包。事實(shí)上是這樣的情況:


5

類似地味赃,假如NoisyDog是Dog的子類掀抹,下面的代碼是合法的:


6

在第三行,我們建立了一個Dog數(shù)組心俗。第四行我們將Dog數(shù)組轉(zhuǎn)型為NoisyDog數(shù)組傲武,這就意味著我們將每個元素分別轉(zhuǎn)為NoisyDog類。

你可以用is運(yùn)算符測試元素類型來測試數(shù)組的類型:


7

如果每個元素均為NoisyDog,那么結(jié)果就是True谱轨。

同樣的戒幔,as?運(yùn)算符將把一個數(shù)組轉(zhuǎn)為包在可選值中的數(shù)組土童,如果無法下行轉(zhuǎn)換诗茎,結(jié)果將是nil。


8

數(shù)組轉(zhuǎn)型的目的和其他類型的轉(zhuǎn)型是類似的——你可以發(fā)送合適的消息給轉(zhuǎn)型后的數(shù)組献汗。如果NoisyDog聲明了Dog類沒有的方法敢订,你就不能向Dog類型的數(shù)組發(fā)送該方法。這樣你就需要將元素轉(zhuǎn)型為NoisyDog罢吃,然后編譯器才會讓你去進(jìn)行發(fā)送方法消息楚午。你既可以將其中的元素進(jìn)行轉(zhuǎn)型,也可以將整個數(shù)組進(jìn)行轉(zhuǎn)型尿招。

數(shù)組的比較:

如果兩個數(shù)組元素?cái)?shù)一樣且全部相等的話矾柜,那么就是相等的。


9


10

數(shù)組是值類型:

由于數(shù)組是結(jié)構(gòu)體就谜,所以其不是引用類型怪蔑,而是值類型。這就意味著丧荐,每一次數(shù)組被分配到變量或者作為函數(shù)參數(shù)缆瓣,它都會被復(fù)制一份。然而我不是在暗示這種復(fù)制的代價(jià)很大虹统。如果數(shù)組的引用是一個常量弓坞,那么顯然復(fù)制就不是必要的了,甚至從其他數(shù)組產(chǎn)生新數(shù)組的操作或者轉(zhuǎn)變數(shù)組的操作已經(jīng)是非常高效的了车荔。

你只需相信Swift的設(shè)計(jì)者已經(jīng)考慮過這個問題渡冻,而且在后臺處理數(shù)組是十分高效的。

雖然數(shù)組本身是值類型忧便,但是其元素是引用類型的還是按照引用類型來對待菩帝。特別是類的實(shí)例為元素的數(shù)組,如果被多個變量引用茬腿。那么就會產(chǎn)生多個引用這一個相同的實(shí)例呼奢。

數(shù)組下標(biāo):

數(shù)組結(jié)構(gòu)體利用下標(biāo)方法允許通過在引用變量后面添加包含值的方括號來取出元素。值可以是Int比如arr[1] 就是取出arr數(shù)組的第二個值切平。值還可以是Int的范圍握础,比如,arr[1...2]就是去取出第二個和第三個值悴品,嚴(yán)格的說禀综,這會產(chǎn)生叫做ArraySlice的東西简烘,其非常類似于Array,比如你可以用和數(shù)組一樣的下標(biāo)來取出ArraySlice的元素定枷;而且它也可以用在數(shù)組能用的地方孤澎。一般地,你就把他當(dāng)做是數(shù)組就可以了欠窒。

如果數(shù)組的引用是可變的(即var覆旭,而不是let),那么下標(biāo)的表達(dá)方法也可以用來被分配值岖妄。這會改變那個被下標(biāo)表達(dá)元素的值型将,被分配的值必須是與數(shù)組元素的類型一致。


11

如果下標(biāo)是一段區(qū)間荐虐,那么賦的值就必須是一個數(shù)組七兜,這有可能改變數(shù)組的長度:


12

下標(biāo)超過應(yīng)有的范圍就會引起運(yùn)行錯誤。

嵌套數(shù)組:

數(shù)組的元素是數(shù)組是合法的福扬。比如:


13

它是Int類型數(shù)組的數(shù)組腕铸。它的類型聲明是[[Int]]。(沒有規(guī)定說铛碑,內(nèi)部的數(shù)組必須是相同長度狠裹,上面只是為可了便于表達(dá))

為了得到內(nèi)部的數(shù)組元素,你可以使用下標(biāo)鏈:


14

如果外部數(shù)組的引用是可變的亚茬,你還可以進(jìn)行寫入:


15

你可以用其他方法改編內(nèi)部數(shù)組,比如你可以為它添加新的元素浓恳。

基本數(shù)組屬性和方法:

數(shù)組是一個集合(采用CollectionType協(xié)議)刹缝,而集合又是一個序列(采用SequenceType協(xié)議)。如果這些項(xiàng)有熟悉的情景颈将,如同String的characters梢夯。從這個方面來看,它與字符序列是很像的晴圾。

作為集合颂砸,數(shù)組的count只讀屬性表示元素的個數(shù)。當(dāng)count為0時(shí)候死姚,isEmpty屬性就是true人乓。

數(shù)組的first和last只讀屬性返回了它的第一個和最后一個元素,但是它們均被可選值包裹都毒,因?yàn)閿?shù)組有可能為空色罚,此時(shí)它們的值就是nil。這是在Swift中比較少見的雙重可選的情況账劲,比如戳护,當(dāng)你聲明一個類型為Int金抡?的數(shù)組的時(shí)候,此時(shí)如果為nil腌且,那么就是Int梗肝??铺董。

數(shù)組的最大下標(biāo)比count要少1巫击,有時(shí)你需要引用count來計(jì)算得出下標(biāo)是多少。比如你可以這樣來得到數(shù)組的后兩位柄粹,

16

Swift不允許你使用負(fù)數(shù)作為這種計(jì)算的捷徑喘鸟,而另一方面,如果你想要得出倒數(shù)幾位元素驻右,不妨使用suffix方法:


17

對于suffix和prefix方法什黑,都允許范圍超出:


18

通過前綴的個數(shù)多少來取出元素跪者,還可以用前綴的序數(shù)來表示取出元素:


19

數(shù)組的starIndex屬性是0廷蓉,endIndex屬性則是count的值。此外问词,indices屬性是以starIndex和endIndex為端點(diǎn)的半開區(qū)間森爽。也就是可以取出全部元素的范圍恨豁。如果你的數(shù)組的引用是可變的,你可以改變startIndex和endIndex來獲得新的區(qū)間爬迟。

20

indexOf方法會返回某個元素第一次出現(xiàn)的下標(biāo)橘蜜,要注意此值是可選值。如果該數(shù)組的元素是可比較相等的付呕,那么就可以用==來識別是不是要找的元素计福。


21

即使數(shù)組不是可比較相等的元素,你也是可以用自己的函數(shù)(用元素為參數(shù)徽职,返回bool值)來比較象颖。

22

作為序列,數(shù)組還有contains方法來驗(yàn)證它是否包含某個元素姆钉,同樣如果元素是可等的说订,你也可以用==運(yùn)算符,或者你可以提供自己的函數(shù)(參數(shù)為元素類型潮瓶,返回值為Bool)陶冷。


23

starWith方法則可以用來檢驗(yàn)一個數(shù)組的開始元素是不是與給定的序列符合,或者你也可以用==運(yùn)算符毯辅,或者你可以提供自己的函數(shù)(參數(shù)為元素類型埃叭,返回值為Bool):


24

elementsEqual方法則從序列的一般原則比較數(shù)組是否相同:兩個序列必須等長,而且每個元素相等悉罕。你也可以用==運(yùn)算符赤屋,或者你可以提供自己的函數(shù)(參數(shù)為元素類型立镶,返回值為Bool)。


25

minElement和maxElement返回最小或者最大的元素类早,同樣會被包在可選值中以防為空數(shù)組媚媒。如果元素可比,你也可以用<運(yùn)算符涩僻,或者你可以提供自己的函數(shù)(參數(shù)為元素類型缭召,返回值為Bool)。第三行是驗(yàn)證是否絕對值較小的數(shù)是兩個中的前者逆日。


26

如果數(shù)組的引用是可變的嵌巷,append和appendContentsOf這兩個實(shí)例方法都可以在數(shù)組末尾添加新元素。兩者的差別是室抽,append參數(shù)只是元素類型的單個值搪哪,而appendContentsOf則需要一個序列作為參數(shù)。比如:


27

+運(yùn)算符被重載為類似于appendContentsOf(不是append)坪圾。當(dāng)+前的運(yùn)算元是數(shù)組時(shí)晓折,它不會產(chǎn)生新的數(shù)組,所以即使引用的數(shù)組是常量也可以用兽泄。如果引用是變量漓概,就可以用+=來代替:


28

如果數(shù)組的引用量是可變的,實(shí)例方法insert(atIndex:)將單個元素插入到所給的下標(biāo)處病梢。如果要一次插入多個元素胃珍,可以使用insertContentsOf(at:)方法。

如果數(shù)組的引用量是可變的蜓陌,實(shí)例方法removeAtIndex可以將該下標(biāo)的元素移除觅彰,實(shí)例方法removeLast則會移除最后一個元素,removeFirst則會移除第一個元素护奈。這些方法也會將移除的元素返回缔莲,如果你不需要返回值哥纫,就不用理他們了霉旗。這些值不會被包在可選值里面,并且如果越界會引起崩潰蛀骇。removeLast還可以引入Int參數(shù)厌秒,來移除多個值,但是不會返回值擅憔,而且如果越界會引起崩潰鸵闪。

另一方面,popFirst和poplast將會返回可選值暑诸,所以即使是空數(shù)組也是安全的蚌讼。如果引用量是不可變的辟灰,你可以用dropFirst和dropLast來返回改變了的數(shù)組(確切的說是ArraySlice)。

實(shí)例方法joinWithSeparator以嵌套數(shù)組開頭篡石,它會取出單獨(dú)的數(shù)組元素芥喇,然后將參數(shù)數(shù)組插入到原數(shù)組元素之間。最后的結(jié)果就是被分割的數(shù)組凰萨,即JoinSeparater继控,最后在強(qiáng)制轉(zhuǎn)換成數(shù)組:


29

調(diào)用JoinWithSeparater,以空數(shù)組為參數(shù)可以“夷平”數(shù)組:


30

還有專門的實(shí)例方法flatten胖眷,它會返回JoinSeparater,然后在強(qiáng)制轉(zhuǎn)換為數(shù)組武通。

reverse實(shí)例方法會產(chǎn)生新的數(shù)組,其元素是倒過來的珊搀。

sortInplace和sort分別能將原始數(shù)組整理順序冶忱,和產(chǎn)生新的數(shù)組。同樣你有兩個選擇食棕,若果是可比較的就可以用<運(yùn)算符朗和,或者提供一個函數(shù)接受兩個參數(shù)并返回一個bool值,

31

在最后一行簿晓,我提供了一個匿名函數(shù)眶拉,或者你可以傳遞一個已經(jīng)聲明了的函數(shù)。在Swift中憔儿,比較運(yùn)算符就是它的函數(shù)名忆植,因此我可以更簡潔地這樣做:


32

split實(shí)例方法將數(shù)字分成嵌套數(shù)組,并可以傳遞測試谒臼,通過測試的將會被刪除朝刊。

33

數(shù)組枚舉和變形:

數(shù)組是序列,所以你可以將它枚舉化蜈缤,通過按順序檢查和操作每個元素拾氓。最簡單的就是for in循環(huán)


34

或者還可以使用forEach實(shí)例方法底哥,它的參數(shù)是一個函數(shù)咙鞍,該函數(shù)的參數(shù)是數(shù)組的一個元素,沒有返回值趾徽。它其實(shí)就是與for in功能類似的函數(shù)续滋。


35

如果你還需要元素的下標(biāo),調(diào)用enumerate實(shí)例方法并在結(jié)果處循環(huán)孵奶,這樣每次循環(huán)得到的都是一個元組疲酌。


36

Swift還提供了,三個有效的數(shù)組變形實(shí)例方法。比如forEach朗恳,這些方法都會為你枚舉化數(shù)組湿颅,所以循環(huán)是隱含在方法調(diào)用中的,這會使你的代碼更加簡潔粥诫。

我們先從map實(shí)例方法開始肖爵,它會產(chǎn)生新數(shù)組,其中的新元素都是原數(shù)組的元素經(jīng)過我們所提供函數(shù)處理的結(jié)果臀脏。該函數(shù)的參數(shù)是數(shù)組元素的類型劝堪,然后返回的值是有可能為其他類型的值。Swift會自動推斷返回的數(shù)組元素的類型揉稚。

比如:可以為數(shù)組的每個元素都乘以2


37

下面這個例子是說map可以產(chǎn)生不同類型的數(shù)組:


38

實(shí)際開發(fā)中的例子:想要將UITableView中的一個section的cell放到同一個NSObject數(shù)組中去秒啦,sec是section的序號:


39

或者可以用更簡潔的map方法:


40

由于map實(shí)際上是CollectionType的實(shí)例方法,而區(qū)間(本身就是CollectionType)搀玖,所以可以進(jìn)一步簡寫:


41

filter實(shí)例方法也會產(chǎn)生一個新數(shù)組余境,然而其中的元素是經(jīng)過過濾的原數(shù)組元素,你可以提供具體的過濾函數(shù)灌诅,該函數(shù)接受一個元素類型值并返回一個bool值來驗(yàn)證是否要把該元素過濾掉芳来。


42

最后就是reduce實(shí)例方法,如果你接觸過LISP或者Scheme猜拾,你可能對其很熟悉即舌,否則你可能會覺得有點(diǎn)晦澀。這是一種將序列中所有元素都結(jié)合在一起的方法挎袜,它會產(chǎn)生唯一的值顽聂,該值不一定要與原數(shù)組元素的類型一樣。你需要提供的函數(shù)的值有兩個參數(shù)盯仪,第一個參數(shù)是結(jié)果類型的值紊搪,第二個參數(shù)是原數(shù)組元素的類型的值。每次迭代的結(jié)果會自動成為下一次的第一個參數(shù)全景,第二個參數(shù)則為下一個數(shù)組元素耀石。不過你需要提供第一次迭代時(shí)的第一個參數(shù)。最后結(jié)果就是該值和原數(shù)組元素的積累爸黄,并且其類型為該值的類型滞伟。

每一個參數(shù)對都會被加總在一起,然后作為下一次迭代的第一個參數(shù)馆纳,如果我們要的是全部數(shù)組元素的加總诗良,那么顯然這個值應(yīng)該是0汹桦。


43

再一次鲁驶,我們可以精簡這段代碼,因?yàn)?就是需要函數(shù)的名字:


44

在實(shí)際編程中舞骆,我相當(dāng)以來這幾個方法钥弯,經(jīng)常用兩個以上径荔,將他們嵌套或者鏈起來。這里有個例子脆霎,雖然看起來有點(diǎn)復(fù)雜总处,但是卻很好地解釋了如何使用Swift數(shù)組。


45

Swift Array&Oc NSArray:

當(dāng)你在進(jìn)行iOS編程的時(shí)候睛蛛,你會將Foundation框架import(或者可以導(dǎo)入U(xiǎn)IKit鹦马,此框架是已經(jīng)導(dǎo)入Foundation的),這樣Oc的NSArray也會被導(dǎo)入忆肾。Swift的Array橋接了Oc的NSArray荸频,但是這種橋接只有在數(shù)組類型是可以橋接的時(shí)才可以。Oc中能成為數(shù)組元素的條件比于Swift既是寬松的又是嚴(yán)格的客冈。NSArray的元素不一定都是一樣的類型旭从,另一方面Oc的數(shù)組元素必須是對象,這和Oc如何理解對象有關(guān)场仲。一般地和悦,如果它可以被向下轉(zhuǎn)型AnyObject,它就可以進(jìn)行橋接渠缕。這就是說要不它是類鸽素,要不它是特殊的可以進(jìn)行橋接的結(jié)構(gòu)體,如Int亦鳞、Double或String付鹿。

由此將Array傳遞給Oc是容易的。若你的Array的元素均可轉(zhuǎn)型AnyObject蚜迅,那么你可以直接進(jìn)行傳遞舵匾。通過分配或者作為函數(shù)的參數(shù)。


46

若要在Swift的Array中調(diào)用NSArray的方法谁不,你可以把它轉(zhuǎn)型為NSArray:


47

Swift的Array只要引用類型為var聲明就是可改變的坐梯,而NSArray無論是聲明什么都是不可以改變的。NSMutableArray才是正解刹帕,它是NSArray的子類吵血。你無法轉(zhuǎn)型,分配偷溺,傳遞一個Swift Array到NSMutableArray蹋辅。你需要先強(qiáng)制變換類型。最好方法就是直接調(diào)用NSMutableArray 構(gòu)造器 init(array:)挫掏,你可以直接將Array作為參數(shù)傳入侦另。


48

將NSMutableArray變?yōu)锳rray,則可以用轉(zhuǎn)型(Cast),如果你想要一個原始Swift類型的數(shù)組褒傅,你需要進(jìn)行兩次轉(zhuǎn)型:


49

如果一個Swift對象類型無法轉(zhuǎn)型為AnyObject弃锐,那么他就無法橋接至Oc,如果你試著將一個包含該類型實(shí)例的數(shù)組傳遞到需要NSArray的地方殿托,編譯器就會阻止你霹菊。在這種情況,你需要自己進(jìn)行橋接支竹。

比如有一個類型是CGPoint的Array旋廷,雖然在Swift中沒有任何問題,但是CGPoint是一個結(jié)構(gòu)體礼搁,在Oc中就無法使用柳洋,你也就不能將它放在NSArray中,如果你試著將它傳遞到需要NSArray的地方叹坦,就會有“[CGPoint]is not convertible to NSArray.”的錯誤報(bào)告熊镣。對策是:將每個CGPoint包進(jìn)一個NSValue中(Oc的對象類型,專門是非對象類型的容器)募书,這樣我們就可以有一個類型是NSValue的數(shù)組绪囱,并可以提交給OC。


50

另一種情況就是莹捡,可選的Swift數(shù)組鬼吵,Oc的集合類型是不能包含nil的,畢竟在Oc中nil就不是一個對象篮赢。所以你就不能把這種包含可選值的數(shù)組直接傳給需要NSArray的地方齿椅。在傳遞之前,你需要做點(diǎn)事:如果可選值包含值启泣,你可以先進(jìn)行解包涣脚,但是如果它不包含值,就沒法解包(nil)寥茫。對此遣蚀,你可以用Oc的NSNull類,它的唯一實(shí)例就是NSNull( )纱耻,可以代表nil芭梯。因此對于一個可選值包著字符串的數(shù)組就可以在不是nil的元素上進(jìn)行解包,在是nil的地方進(jìn)行NSNull()代替弄喘。


51


現(xiàn)在再來談?wù)凮c的NSArray到了Swift的情形玖喘,這樣方向的橋接是沒有任何問題的:NSArray可以很安全地變?yōu)锳rray。但是這樣轉(zhuǎn)變來的數(shù)組的類型是什么呢蘑志?要知道NSArray并沒有帶著其元素的類型信息累奈。因此默認(rèn)地NSArray將會變成類型是AnyObject的數(shù)組贬派。

不過幸運(yùn)的是,從Xcode7開始费尽,Oc改變了其NSArray, NSDictionary, or NSSet這三種可橋接至Swift的集合類型,使其變得能攜帶元素類型信息了(OC叫這個是lightweight generic)羊始。而在iOS9中旱幼,Cocoa API也修改為可以包含該信息。因此突委,絕大多數(shù)你從Cocoa接受的數(shù)組可以直接被識別類型柏卤。

比如,這種簡潔的代碼在以前是無法實(shí)現(xiàn)的:


52

其結(jié)果是一個包含字符串?dāng)?shù)組的數(shù)組匀油,分類列出了所有可用的字體缘缚。這在以前是不可能的,因?yàn)閁IFont的這兩種方法之前都是不可見的(他們以前會被認(rèn)為是AnyObject數(shù)組)敌蚜,而現(xiàn)在會被認(rèn)為是返回字符串?dāng)?shù)組的函數(shù)桥滨。

不過還是很有可能遇到從Oc接受AnyObject數(shù)組的情況的,如果真的遇到了弛车,你就需要將其轉(zhuǎn)型或者變?yōu)槟撤N特定的Swift類型齐媒。

下面就是一個Oc類包含一個返回NSArray的方法(沒有被類型標(biāo)記):


53

調(diào)用該方法并轉(zhuǎn)換結(jié)果,就需要將結(jié)果轉(zhuǎn)型為String的數(shù)組纷跛,


54

Oc的數(shù)組可以包含多種類型的對象喻括,不要強(qiáng)制將這種數(shù)組變?yōu)槠渲性夭荒苻D(zhuǎn)換的類型,否則就會崩潰贫奠。對于這種情況要對癥下藥唬血!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市唤崭,隨后出現(xiàn)的幾起案子拷恨,更是在濱河造成了極大的恐慌,老刑警劉巖谢肾,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挑随,死亡現(xiàn)場離奇詭異,居然都是意外死亡勒叠,警方通過查閱死者的電腦和手機(jī)兜挨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來眯分,“玉大人拌汇,你說我怎么就攤上這事”拙觯” “怎么了噪舀?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵魁淳,是天一觀的道長。 經(jīng)常有香客問我与倡,道長界逛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任纺座,我火速辦了婚禮息拜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘净响。我一直安慰自己少欺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布馋贤。 她就那樣靜靜地躺著赞别,像睡著了一般。 火紅的嫁衣襯著肌膚如雪配乓。 梳的紋絲不亂的頭發(fā)上仿滔,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天,我揣著相機(jī)與錄音犹芹,去河邊找鬼堤撵。 笑死,一個胖子當(dāng)著我的面吹牛羽莺,可吹牛的內(nèi)容都是我干的实昨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼盐固,長吁一口氣:“原來是場噩夢啊……” “哼荒给!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起刁卜,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤志电,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蛔趴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挑辆,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年孝情,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鱼蝉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡箫荡,死狀恐怖魁亦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情羔挡,我是刑警寧澤洁奈,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布间唉,位于F島的核電站,受9級特大地震影響利术,放射性物質(zhì)發(fā)生泄漏呈野。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一印叁、第九天 我趴在偏房一處隱蔽的房頂上張望被冒。 院中可真熱鬧,春花似錦喉钢、人聲如沸姆打。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至玛追,卻和暖如春税课,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背痊剖。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工韩玩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人陆馁。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓找颓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親叮贩。 傳聞我的和親對象是個殘疾皇子击狮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 01-常量與變量 學(xué)習(xí)swift第一步打印Hello World print("Hello World") swi...
    iOS_恒仔閱讀 5,166評論 2 19
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件益老、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,119評論 4 61
  • 今天看了贏這本書彪蓬,由[美]杰克·韋爾奇著。主要講怎樣才能贏捺萌。全書總共分為五個部分档冬,今天我只看了第一部分,第一部分是...
    YaoYiLin閱讀 289評論 0 1
  • 這周面臨著一個新機(jī)會的選擇桃纯,和處在不同位置的朋友們聊了聊酷誓,對每個人的感受也不盡相同。 有的人态坦,讓你絕望呛牲,不想與之合...
    louise楊琴閱讀 271評論 4 1
  • 沿著清幽小徑 尋覓夢中背影 草葉隨風(fēng)吟哦出闕闕戀歌 疏狂的虬枝剪碎了落日的幾許依戀 顫顫的流水鋪滿了我的相思 彼岸...
    眉清淺閱讀 328評論 0 2