3

プロトコル インスタンスの配列をどのようにAnyObjects にダウンキャストしますか? 以下のコード例で、より合理的なアイデアをいくつか試しました。

protocol Nameable : class {
    var name: String { get }
}

class Person: Nameable {
    var name: String

    init(name: String)
    {
        self.name = name
    }
}

class Example {

    func setArray(array: [AnyObject]?, forKey: String)
    {
        print("hello world")
    }
}

var personOne = Person(name: "Evan")
var personTwo = Person(name: "Brian")

var array: [ Nameable ] = [ personOne, personTwo ]

var anotherArray = array.map({ $0 as AnyObject })    // OMG gross!
var yetAnotherArray = array as [ AnyObject ]         // Nope.
var evenYetAnotherArray = array as? [ AnyObject ]    // Nope.
var omgThisIsAnArray = Array<AnyObject>(array)       // Ha ha, srsly. Nope.

var myExample = Example()
myExample.setArray(anotherArray, forKey: "Named")

価値のあることとしては、setArray(_ anArray: [AnyObject]?, forKey aKey: String)メソッド シグネチャは Apple のクラスに由来するNSUbiquitousKeyValueStoreため、タイプ セーフになるように再設計することはできません。

4

2 に答える 2

4

完璧ではありませんが、プロトコルとクラスが両方@objc(およびクラスのサブクラスNSObject)である場合に機能します。

@objc protocol Nameable: class {
    var name: String { get }
}

@objc class Person: NSObject, Nameable {
    var name: String
    init(name: String) {
        self.name = name
    }
}

...

var array: [Nameable] = [personOne, personTwo]
let array2 = array as [AnyObject] // ✓
于 2016-04-15T02:54:25.347 に答える