如何在swift中将通用对象保存到数组中

时间:2017-12-07 08:24:25

标签: arrays swift generics

我上课了

class SomeClass<T>: AsyncOperation, NetworkOperationProtocol {

    /// The resource model object that conforms to Parsable Response
    public typealias Resource = T
}

我想将此类的实例保存到数组中,并希望稍后检索它。 我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:0)

如果你的通用类型是:

struct GenericType {}

您可以使用以下方法指定泛型类:

let array = [SomeClass<GenericType>]()

或者您可以通过以下方式让它自己推断出类型:

class SomeClass<T>: AsyncOperation, NetworkOperationProtocol {

    /// The resource model object that conforms to Parsable Response
    public typealias Resource = T
    let resource: Resource

    init(with resource: Resource) {
        self.resource = resource
    }
}

let item = SomeClass(with: GenericType())
let array = [item]

答案 1 :(得分:0)

应该很简单 你可以像这样声明一个数组

var anArray = [SomeClass<Parsable>]()

请注意,在声明数组时,我已经定义了Parsable而不是T.

如果您在创建阵列时不知道T的类型。你可以按照以下方式进行

var anArray = [AnyObject]()

let anObject = SomeClass<Parsable>()
anArray.append(anObject)

if anArray[0] is SomeClass<Parsable> {
    print(true)
}

答案 2 :(得分:0)

如果你的类使用关联类型实现协议,则无法将其放入数组中,因为这些协议具有自我要求 - 他们需要知道关联类型的具体类型。

但是,您可以使用名为type-erasure的技术来存储没有相关类型信息的类型。因此,例如,您可以创建一个没有关联类型的协议,如此

protocol Operation {
   func perform()
}

class SomeClass<T> : AsyncOperation, NetworkOperationProtocol, Operation

然后定义一系列此类操作:

let operations : [Operation] = []
operations.append(SomeClass.init())