我的Array + RemoveObject.Swift应该包含什么?

时间:2016-01-04 01:07:32

标签: ios arrays swift indexof

我正在使用模板项目来尝试构建一个新的应用程序。当我运行模板项目时,我收到一条错误消息:' [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个错误。

1 个答案:

答案 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扩展时,这可能特别有用。参见例如以下是这样的例子: