2014-06-10 73 views
2

我想遍歷一個字符串數組,使用Swift中的全局枚舉函數。在Swift枚舉函數

它看起來像這樣:

let fontNames = UIFont.fontNamesForFamilyName(familyName) 

for (index, value) in enumerate(fontNames) { 
    // Do something here  
    } 

但Xcode中有一個錯誤,說

抱怨

不能轉換表達式的類型「EnumerateGenerator爲鍵入 '$ T1'

回答

2

fontNamesForFamilyName()回報AnyObject [ ]!,它不能直接枚舉。你已經明確地輸入了你的fontNames數組。

let fontNames: Array = UIFont.fontNamesForFamilyName(familyName) 
for (index, value : AnyObject) in enumerate(fontNames) { 
    println(value) 
} 

而作爲@Van杜陳德良在下面的評論中指出,對於枚舉語法斯威夫特2.改變現在你可以使用以下。

let fontNames: Array = UIFont.fontNamesForFamilyName(familyName) 
for (index, value) in fontNames.enumerate() { 
    print(value) 
} 

另外值得一提的是,由於fontNamesForFamilyName現在使用的Objective C的泛型類型,它返回[String]所以不需要從AnyObject轉換。

+1

根據API文檔,該函數實際返回'AnyObject []!' –

+1

@CraigOtis是的,謝謝指出。糾正。 –

+1

是的,這是我的理解 - 在閱讀文檔之後 - 它返回了一個我認爲可以枚舉的AnyObjects數組。但0x7ffffff的答案有效。 – rohdester

1

我可能不同意@ 0x7fffffff的回答。我認爲問題不是AnyObject[]不能直接枚舉,而是它返回爲隱式解包可選。

作爲一個測試:

let myStuff: AnyObject[] = ["Neat"] 
    for (index, value) in enumerate(myStuff) { // < No issues 
     print("\(value)") 
    } 

    let myStuff2: AnyObject[]! = ["Neat"] 
    for (index, value) in enumerate(myStuff2) { // < Compiler error 
     print("\(value)") 
    } 

我認爲更好的解決方案是解開可選在enumerate()功能:

for (index, value) in enumerate(fontNames!) { // < Note the bang 
... 
+1

我想我不明白,但如果它作爲一個隱含的* unwrapped *選項返回給我們,爲什麼我們需要*再次打開它來使用它呢?這看起來好像展開了兩次。 –

+1

好問題,和/但它看起來像他們固定這6通用。也就是說,「let myStuff = ...」中的劇組不再有效,但顯然你不需要它。 let myStuff2: [String]! = ["Neat"] for (index, value) in enumerate(myStuff2) { /* now works */ \t print("\(value), \(myStuff2[index])") }

1

我給你一個未來的答案:)

Swift 2.0,該方法的簽名是:

class func fontNamesForFamilyName(_ familyName: String) -> [String] 

,並使用它:

let fontNames = UIFont.fontNamesForFamilyName(familyName) 

for (index, value) in fontNames.enumerate() { 
    // Do something here  
} 

雨燕1.2,該方法的簽名是:

class func fontNamesForFamilyName(familyName: String) -> [AnyObject] 

,並使用它:

let fontNames = UIFont.fontNamesForFamilyName(familyName) 

for (index, value) in enumerate(fontNames) { 
    // Do something here 
} 

注在這兩種情況下,fontNames不是可選。