使用协议时Swift Array向下转换运行时错误

时间:2015-02-04 04:13:54

标签: ios swift

这是我的设置:

protocol Client {
    var identifier: NSUUID { get }
}

class PeripheralClient: NSObject, Client { 
    var identifier: NSUUID {
        get {
            return peripheral.identifier
        }
    }
}

protocol NetworkManager {
    var clients: [Client] { get set }
}

class CentralNetworkManager: NSObject, NetworkManager {
    var clients = [Client]()
    var peripheralClients: [PeripheralClient] {
        get {
            return clients as [PeripheralClient]
        }
    }
}

第一次访问peripheralClients数组时出现此运行时错误:数组元素无法桥接到Objective-C

从此answer到具有类似错误的问题,看起来swift要求转换为AnyObject时数组中的项目NSArray兼容。这意味着Swift的阵列类型转换正在使用NSArray,因此我无法从类型为协议的数组中进行向下转换。

任何人都有一个很好的建议来解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

您是否尝试将Client声明为Objective-C协议?

@objc protocol Client {
    var identifier: NSUUID { get }
}

答案 1 :(得分:0)

是的,看起来,Swift本身没有Array<T>Array<U>投射功能,它使用了Obj-C工具。

相反,为避免这种情况,您可以使用map转换每个元素,例如:

var clients = [Client]()
var peripheralClients: [PeripheralClient] {
    get {
        return clients.map { $0 as PeripheralClient }
    }
}