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 回答
0

这并不能真正直接回答您的问题,但我认为这不会像您期望的那样工作。

来自 NSUbiquitousKeyValueStore setArray 的文档:

一个数组,其内容可以以属性列表格式存储。换句话说,数组中的对象必须是NSNumberNSStringNSDateNSDataNSArrayNSDictionary类型。数组及其内容的总大小(以字节为单位)不得超过每个键的大小限制。

您正在尝试将数据放入上述任何内容中,我猜您会遇到问题。

像这样的东西会起作用:

import UIKit // For String<->NSString bridging

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 nameArray = array.map({ $0.name }) // Now [String]

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

或者,您可以以其他方式序列化您的 Swift 对象,以将它们放入受支持的类之一。

于 2016-04-15T03:09:29.620 回答