我正在尝试创建一个全局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
的设计示例。
答案 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
变量。