你自己的功能对我来说很好(Swift 2.1.1,Xcode 7.2)。似乎您希望此函数成为您的公共类的方法。对于一个最小的工作示例,您至少需要将 removeObject() 方法包装在您希望它所属的类中。另请注意,您不需要使用单独的行来分配来自.indexOf(..) 调用(可能是nil)的结果,但可以在单个 if let 语句中添加分配和nil check。
public class MyArrayOperations {
// ...
static public func removeObject<T: Equatable>(object: T, inout fromArray array: [T]) {
if let index = array.indexOf(object) {
array.removeAtIndex(index)
}
}
}
var arr = ["1", "2","3"]
MyArrayOperations.removeObject("2", fromArray: &arr)
print(arr) // ["1", "3"]
还请注意,您可以使用两个泛型显式声明相同的行为,以防您希望数组本身符合某些协议。然后,您为数组类型使用一种单独的泛型,为其元素使用一种,然后指定元素类型应符合数组的Generator.Element 类型。例如:
func removeObject<T: Equatable, U: _ArrayType where U.Generator.Element == T>(object: T, inout fromArray array: U) {
if let index = array.indexOf(object) {
array.removeAtIndex(index)
}
}
使用这种方法,您可以在上面的函数签名中为数组泛型 U 添加一个附加协议,例如
func removeObject<T: Equatable, U: protocol<_ArrayType, MyProtocol> where U.Generator.Element == T>(object: T, inout fromArray array: [T]) { ...
这在“模拟”符合某些协议的通用Array 扩展时特别有用。参见例如以下为此类示例: