ios - 类型 NSArray 不能被隐式向下转换

标签 ios objective-c swift

我正在努力将我的应用程序转换为 swift,但我遇到了一个我还不太明白的 swift 错误。

在 Obj-c 中我有一个 for in 循环:

for (MYVisitor *visitor in visitors) {
    if (visitor.boxState == MYVisitorBoxStateChatting) {
        [self.chattingVisitors addObject:visitor];
    }
    else {
        [self.unknownVisitors addObject:visitor];
    }
}

很快我有:

for visitor: MYVisitor in visitors {
        if visitor.boxState == MYVisitorBoxStateChatting {
            self.chattingVisitors.addObject(visitor)
        }
        else {
            self.unknownVisitors.addObject(visitor)
        }
    }

我在 swift 中收到一条错误消息:NSArray 不能隐式向下转换为 MYVisitor,您是想使用 as 强制向下转换吗?

Xcode 推荐这个改变:for visitor: FHVisitor in visitors as MYVisitor {... 然后给我这个错误:MYVisitor does not conform to protocol SequenceType

最佳答案

如果 visitors 是一个 NSArray 并且保证它的所有元素都是 MYVisitor 类型,然后您可以将数组转换为 [MYVisitor]:

for visitor in visitors as [MYVisitor] {
    // ...
}

请注意,如果任何数组元素不是MYVisitor,这将在运行时崩溃。

或者,你可以检查数组

if let theVisitors = visitors as? [MYVisitor] {
    for visitor in theVisitors {
        println(visitor.name)
    }
} else {
    // This is not an array of MYVisitor objects.
}

或者您可以检查每个数组元素:

for item in visitors {
    if let visitor = item as? MYVisitor {
        // ...
    } else {
        // This is not a MYVisitor.
    }
}

关于ios - 类型 NSArray 不能被隐式向下转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27805501/

相关文章:

ios - 有没有办法不使用 touchid api 来使用指纹扫描仪

objective-c - 从 Nib 加载菜单

ios - 获取 sharedApplication' 在我的苹果 watch 应用程序中不可用

ios - Alamofire - 从 Swift 2 转换到 swift 3 时出错

javascript - Swift JSContext 总是返回 nil

ios - CLLocationManager 位置监控无法正常工作

ios - Swift:如何实现字符串数组的枚举

iphone - 检测 UIAlert/通知

ios - 保留其键的 NSMutableDictionary

ios - 撤销当前的 APNs key 会破坏实时应用程序吗?