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

标签 ios arrays swift indexof

我正在使用模板项目来尝试构建新应用程序。当我运行模板项目时,出现错误:“[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/

相关文章:

ios - 将信息从 Parse 中的用户指针添加到数组 - Swift

ios - 如何使用 NSURLSession 从 block 中获取数据?

python - 将 numpy 数组每行移动一个递增的值

ios - 来自 Swift Range 的 NSRange?

ios - 从上下文中分离(断开)核心数据实体

ios - 将照片保存到核心数据

复制一个 3 dim 数组本身

javascript - Jquery/JavaScript 的奇怪数组作用域问题

ios - 尝试使用 swift 将 XML 从 URL 解析为 PickerView

swift - 与 Alamofire 一起使用 UIImagePickerController 上传图像