2014-06-10 69 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不是可选。