【问题标题】:NSObject class conforms to protocol contained in NSArray with SwiftNSObject 类使用 Swift 符合 NSArray 中包含的协议
【发布时间】:2015-06-16 08:14:52
【问题描述】:

我想在 Swift 中创建一个方法,该方法返回一个符合协议的 NSObject 对象数组。 我尝试过这样的事情:

func createManagers() -> [Manager] {
    let result = NSMutableArray(capacity: self.classes.count)
    (self.classes as NSArray).enumerateObjectsUsingBlock { (object: AnyObject!, idx: Int, stop: UnsafeMutablePointer<ObjCBool>) -> Void in
        // TODO: do something and fill the result array
    }
    return result as NSArray as! [Manager]
}

Manager 如您所见,是一个协议。我收到返回语句中的强制转换总是失败的错误。
我想告诉编译器我有一个 NSObject 类型的对象数组,并且所有元素都符合 Manager 协议。

【问题讨论】:

    标签: swift nsarray protocols swift2 swift-array


    【解决方案1】:

    不要尝试在 Swift 中编写 Objective-C。远离NSObjectNSArrayNSMutableArray

    这是您的代码,没有任何 Objective-C 类型:

    func createManagers() -> [Manager] {
        let result = [Manager]()
        for (index, aClass) in classes.enumerate() {
            // TODO: do something and fill the result array
        }
        return result
    }
    

    如果您想确保您的返回类型是NSObject 的子类:

    func createManagers<T: NSObject where T: Manager>() -> [T] {
        var result = [T]()
        for (index, aClass) in classes.enumerate() {
            // TODO: do something and fill the result array
        }
        return result
    }
    

    【讨论】:

    • ,能否请您指向我可以阅读更多相关信息的文档?谢谢!
    • here 是关于 Swift 泛型的文档。
    【解决方案2】:

    您的返回类型是具有键 NSObject 和值类型 Manager 的 Dictionary,而不是数组。将返回类型更改为[Manager]。另外你可能想使用数组的map 函数:

    func createManagers() -> [Manager] {
        return classes.map { doSomethingAndTransformIntoManager($0) }
    }
    

    【讨论】:

    • 好的,我要编辑我的问题。这是我第一次尝试,但这不起作用。我想告诉编译器我有一个 NSObject 类型的对象数组,并且所有元素都符合 Manager 协议。
    猜你喜欢
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 2021-02-04
    相关资源
    最近更新 更多