我在 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)
}
Run Code Online (Sandbox Code Playgroud)
我收到编译器错误“无法推断通用参数 T”。这对我来说很有意义,因为classArray变量的类型被推断为[MyClass.Type].
我的问题是,我可以以及如何定义变量classArray,以便编译器知道其中定义的每个类型都符合协议MyProtocol。
我试图在 Swift 中为 Array 类型添加一个扩展,仅限于其元素符合 equatable 协议的数组。我试图以下列方式定义一个函数:
import Foundation
extension Array where Iterator.Element: Equatable {
func deletedIndicies<T: Equatable>(newArray: [T]) -> [Int] {
var indicies = [Int]()
for element in self {
if newArray.index(of: element) == nil {
indicies.append(self.index(of: element)!)
}
}
return indicies
}
}
}
Run Code Online (Sandbox Code Playgroud)
该函数的目的是返回原始数组中没有出现在newArray.
我在 Xcode 中收到的错误是:无法使用类型为 '(of: Element)' 的参数列表调用 'index'
因为我只为元素可相等的数组定义函数,并且要求 的元素是newArray可相等的,所以我不确定为什么我不能调用索引方法。