ArrayType findAndRemove全局函数出错?

时间:2014-06-10 13:19:44

标签: ios swift

我正在尝试创建一个全局findAndRemove函数,以便与ArrayType一起使用并遇到问题。我收到一个错误说:

Cannot convert the expression's type '0' to type '@lvalue Named'

这是函数......

func findAndRemove<C : ArrayType where C.GeneratorType.Element : Equatable>(var domain: C, value: C.GeneratorType.Element) {
  var idx = find(domain, value)
  if idx { domain.removeAtIndex(idx! as Int) }
}

以下是您可以放入Xcode游乐场的随附的人为代码......

class Named {
  let name: String
  init (_ name: String) {
    self.name = name
  }
}

var arr = [Named("Fire"), Named("Water"), Named("Earth"), Named("Air")]
var fire = arr[0]

arr // Returns [Named("Fire"), Named("Water"), Named("Earth"), Named("Air")]
findAndRemove(&arr, fire) // <-- Error occurs here!!!
arr // Should return [Named("Water"), Named("Earth"), Named("Air")]

不要担心这个例子毫无意义,因为我可以使用arr.removeAtIndex(0)。这是一个用于测试findAndRemove的设计示例。

2 个答案:

答案 0 :(得分:1)

解决方案是符合Equatable协议:

class Named {  
    let name: String
    init (_ name: String) {
        self.name = name
    }
}

extension Named : Equatable { }

func ==(lhs: Named, rhs: Named) -> Bool {
    return lhs.name == rhs.name
}

现在这种家具应该正常工作(改为使用inout var):

func findAndRemove<C : ArrayType where C.GeneratorType.Element : Equatable>(inout domain: C, value: C.GeneratorType.Element) -> () {
    var idx = find(domain, value)
    if idx { domain.removeAtIndex(idx! as Int) }
}

我也在最后一次电话会议上延长了答案:

var myArray: Array<Named> = [Named("Fire"), Named("Water"), Named("Earth"), Named("Air")]
var fire: Named = myArray[0]

findAndRemove(&myArray, value: fire)

答案 1 :(得分:0)

您不需要inout修饰符,因为您没有重新分配arr变量。