【问题标题】:Swift Array downcasting runtime error when using a protocol使用协议时 Swift Array 向下转换运行时错误
【发布时间】:2015-02-04 04:13:54
【问题描述】:

这是我的设置:

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 要求数组中的项目在转换为NSArray 时与AnyObject 兼容。所以这意味着 Swift 的 Array 类型转换使用的是 NSArray,因此我无法从类型为协议的 Array 中向下转换。

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

【问题讨论】:

    标签: ios swift


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-30
        相关资源
        最近更新 更多