我正在尝试使用Swift中的全局枚举函数迭代一个字符串数组。
看起来像这样:
let fontNames = UIFont.fontNamesForFamilyName(familyName)
for (index, value) in enumerate(fontNames) {
// Do something here
}
但Xcode抱怨说错误
无法转换表达式' EnumerateGenerator'输入' $ T1'
答案 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
不是可选的。