0

プロトコルに準拠した NSObject オブジェクトの配列を返すメソッドを Swift で作成したいと考えています。私はこのようなことを試しました:

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ご覧のとおりのプロトコルです。return ステートメントでのキャストが常に失敗するというエラーが表示されます。
コンパイラに、NSObject 型のオブジェクトの配列があり、すべての要素が Manager プロトコルに準拠していることを伝えたいと考えています。

4

2 に答える 2

1

Objective-C を Swift で書こうとしないでください。NSObjectNSArrayおよびから離れNSMutableArrayます。

以下は、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
}
于 2015-06-17T16:15:33.393 に答える
0

戻り値の型は、配列ではなく、キー NSObject と値型 Manager を持つ Dictionary です。戻り値の型を に変更し[Manager]ます。mapまた、おそらく配列の関数を使用したいでしょう:

func createManagers() -> [Manager] {
    return classes.map { doSomethingAndTransformIntoManager($0) }
}
于 2015-06-16T08:21:42.793 に答える