类类型的 Swift 数组,每个类类型都符合协议(protocol)并且是普通类的子类

标签 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)
}

我收到编译器错误“无法推断通用参数 T”。这对我来说是有意义的 classArray 的类型变量被推断为 [MyClass.Type] .

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

最佳答案

您可以通过让 SomeClass 符合 MyProtocol 来实现。因此每个子类也必须符合 MyProtocol

那么你的方法签名就是:

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

如果不需要,则可以将 myMethod 的类型更改为非泛型。我认为 swift 无法键入包含 (SomeClass & 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)
}

关于类类型的 Swift 数组,每个类类型都符合协议(protocol)并且是普通类的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47516289/

相关文章:

swift - 如何抓取凭证值重新认证? (问题已更新)

iOS Swift 下载文件

swift - 使用 Swift 从 NSData 中获取数据

ios - 在 swift 2 的一个部分中的单元格之间添加空间

ios - #import <JWPlayer-SDK/JWPlayerController.h> 在桥接 header 中导致错误

ios - Swift:子类 MKPolyline

xcode - Swift:错误:在类型上使用实例成员

ios - 在 Swift 中将平移手势识别器添加到 UITableView

ios - 即使 iOS 应用程序未运行也禁用自动锁定?

objective-c - 在 OS X 中使用 Storyboard时如何为 NSView 创建背景