枚举Swift中的函数

时间:2014-06-10 20:29:10

标签: swift

我正在尝试使用Swift中的全局枚举函数迭代一个字符串数组。

看起来像这样:

let fontNames = UIFont.fontNamesForFamilyName(familyName)

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

但Xcode抱怨说错误

无法转换表达式' EnumerateGenerator'输入' $ T1'

3 个答案:

答案 0 :(得分:2)

fontNamesForFamilyName()返回AnyObject []!,无法直接枚举。您已明确键入fontNames数组。

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

正如@Van Du Tran在下面的评论中指出的那样,在Swift 2中枚举的语法已经改变。现在你可以使用以下内容。

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

值得注意的是,由于fontNamesForFamilyName现在使用了Objective C泛型类型,因此返回[String],因此无法从AnyObject进行转换。

答案 1 :(得分: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
...

答案 2 :(得分:1)

我会给你一个未来主义的答案:)

Swift 2.0 中,方法的签名是:

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

使用它:

let fontNames = UIFont.fontNamesForFamilyName(familyName)

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

Swift 1.2 中,方法的签名是:

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

使用它:

let fontNames = UIFont.fontNamesForFamilyName(familyName)

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

请注意,在这两种情况下,fontNames 是可选的。