我正在使用模板项目来尝试构建新应用程序。当我运行模板项目时,出现错误:“[T] 没有名为“indexOf”的成员。
Array+RemoveObject.swift 文档中的现有代码是:
import Foundation
public func removeObject<T: Equatable>(object: T, inout fromArray array: [T])
{ let index = array.indexOf(object)
if let index = index {
array.removeAtIndex(index)
}
}
问题出在indexOf的使用上吗?奇怪的是,当我尝试使用回答类似问题的人的解决方案时,我从 bond 框架中得到了大约 100 个错误。
最佳答案
你自己的功能对我来说很好(Swift 2.1.1,Xcode 7.2)。似乎您希望此函数成为您的公共(public)类的方法。对于最小的工作示例,您至少需要将 removeObject()
方法包装在您希望它所属的类中。另请注意,您不需要使用单独的行来分配 .indexOf(..)
调用的结果(可能是 nil
),但可以添加分配和 nil
检查单个 if let 语句。
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"]
另请注意,如果您希望数组本身符合某些协议(protocol),您可以使用两个泛型显式声明相同的行为。然后,您对数组类型使用一个单独的泛型,对其元素使用一个泛型,此后指定元素类型应符合数组的 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
添加类型约束的附加协议(protocol),例如
func removeObject<T: Equatable, U: protocol<_ArrayType, MyProtocol> where U.Generator.Element == T>(object: T, inout fromArray array: [T]) { ...
这在“模拟”符合某些协议(protocol)的通用 Array
扩展时特别有用。参见例如下面是这样一个例子:
关于ios - 我的 Array+RemoveObject.Swift 应该包含什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34583487/