Swift数组类型,每个类型符合协议并且是公共类的子类

时间:2017-11-27 17:07:17

标签: swift

我在Swift中有一个带有以下形式签名的方法:

func myMethod<T>(class: T.Type) where T: SomeClass & MyProtocol

我想要一个变量,它是一个类数组,它们都是SomeClass的子类,并且符合MyProtocol。

看起来像是:

let classArray = [SubclassOfSomeClass.self, SubclassTwoOfSomeClass.self, SubclassThreeOfSomeClass.self]

SubclassOfSomeClass,SubclassTwoOfSomeClass和SubclassThreeOfSomeClass中的每一个都符合MyProtocol

我想按如下方式致电myMethod

classArray.forEach { classType in

    myMethod(class: classType)
}

我收到编译器错误&#34;无法推断通用参数T&#34;。这对我来说很有意义,因为classArray变量的类型被推断为[MyClass.Type]

我的问题是,可以以及如何定义变量classArray,以便编译器知道其中定义的每个类型都符合协议MyProtocol

2 个答案:

答案 0 :(得分:2)

您可以通过SomeClass符合MyProtocol来实现这一目标。因此,每个子类也必须符合MyProtocol

然后你的方法签名就是:

func myMethod<T>(class: T.Type) where T: SomeClass

如果不需要,那么您可以将myMethod的类型更改为不通用。我认为swift无法输入数组(SomeClass&amp; MyProtocol).Type。在您的情况下,您并没有真正使用通用对象。您确实考虑了特定类型,它是(SomeClass & MyProtocol).Type。您的代码看起来像这样:

protocol MyProtocol: class {

}

class SomeClass: NSObject {

}

class SubClass: SomeClass, MyProtocol {

}

class SubClass2: SomeClass, MyProtocol {

}

let classArray: [(SomeClass & MyProtocol).Type] = [SubClass.self, SubClass2.self]

func myMethod(class: (SomeClass & MyProtocol).Type) {

}

classArray.forEach {
    myMethod(class: $0)
}

答案 1 :(得分:0)

protocol MyProtocol {
   var x: Int { get }
}

class MyClass: NSObject {
    var y: Int = 10
}

class SubClass1: MyClass, MyProtocol {
    private(set) var x: Int = 9
}

class SubClass2: MyClass {
}

class SubClass3: MyClass, MyProtocol {
    var x: Int { return 15 }
}

let items: [MyClass & MyProtocol] = [SubClass1(), SubClass3()]

func myMethod(_ item: MyClass & MyProtocol) {}

classArray.forEach { myMethod($0) }

因此,目前您只能使用 MyClass&MyProtocol