我正在使用模板项目来尝试构建一个新的应用程序。当我运行模板项目时,我收到一条错误消息:' [T]没有名为' indexOf'的成员。
Array + RemoveObject.swift doc中的现有代码是:
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吗?奇怪的是,当我尝试使用回答类似问题的人的解决方案时,我从债券框架中得到了大约100个错误。
答案 0 :(得分:1)
你自己的功能对我来说很好(Swift 2.1.1,Xcode 7.2)。看起来好像你希望这个函数成为你公共类的一种方法。对于最小的工作示例,您至少需要将removeObject()
方法包装在您希望它属于的类中。另请注意,您不需要使用单独的行来分配.indexOf(..)
调用的结果(可能是nil
),但可以在单个if语句中添加赋值和nil
检查。 / p>
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
类型。 E.g:
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
扩展时,这可能特别有用。参见例如以下是这样的例子: