【问题标题】:What should my Array+RemoveObject.Swift contain?我的 Array+RemoveObject.Swift 应该包含什么?
【发布时间】:2016-01-04 01:07:32
【问题描述】:

我正在使用模板项目来尝试构建一个新应用。当我运行模板项目时,我收到一条错误消息:'[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的问题吗?奇怪的是,当我尝试使用回答类似问题的人的解决方案时,我从债券框架中得到了大约 100 个错误。

【问题讨论】:

    标签: ios arrays swift indexof


    【解决方案1】:

    你自己的功能对我来说很好(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 扩展时特别有用。参见例如以下为此类示例:

    【讨论】:

      猜你喜欢
      • 2011-08-18
      • 2012-05-26
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 2015-09-13
      • 1970-01-01
      • 2013-01-19
      • 1970-01-01
      相关资源
      最近更新 更多