Swift字符串不符合AnyObject的要求

3

这是一个有点傻的问题,而且已经被回答很多次了,但我仍然无法理解。

    while let element = enumdirs?.nextObject() as? String {
        println(element)
    }

上述代码出现了错误:Swift字符串不符合AnyObject类型,因此不能使用as关键字。
    while let element = enumdirs?.nextObject() {
        println(element as? String)
    }

运行完美。在while语句中强制转换的问题是什么?

1个回答

4

AnyObject可以表示任何类型的实例。从AnyObjectString的条件转换之所以有效,是因为如果需要,String会桥接到NSString

然而,在可选链中似乎无法正常工作。

while let element = enumdirs?.nextObject() as? String { ... }

所以这可能是编译器的一个bug。如果你将其转换为NSString,它会按预期工作:

while let element : String = enumdirs?.nextObject() as? NSString { ... }

或者明确地取消包装:
while let element = enumdirs!.nextObject() as? String { ... }

但更好的解决方案可能是:
if let enumdirs = NSFileManager.defaultManager().enumeratorAtPath(...) {
    while let element = enumdirs.nextObject() as? String {
        println(element)
    }
}

即在循环中使用之前,使用可选绑定解包枚举器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接