func getIndex<T: Equatable>(valuetoFind: T) -> Int? {...} mutating func replaceObjectWithObject<T: Equatable>(obj1: T,obj2: T) { if let index = self.getIndex(obj1) { self.removeAtIndex(index) self.insert(obj2,atIndex: index) // Error here: 'T' is not convertible to 'T' } }
我有这个函数,假设用另一个元素替换元素.但我对Generics不是很熟悉,也不知道为什么这不起作用.请帮忙.
如果我从变异函数中删除Equatable,则错误消息会跳转到该func中的第一行,如果我将其替换为func find(),则会给出与第3行相同的错误.
实际上,这不可能通过Swift中现有的协议和泛型系统下的扩展来实现 – 您不能为类型的泛型子类型添加其他约束,因此您无法使用要求其内容符合的方法扩展Array等于.
您可以使用内置的Array类型看到这个限制 – 没有myArray.find(element)方法,但是有一个全局函数find()接受一个集合和一个元素,带有一个泛型约束,即集合的元素是Equatable:
func find<C : CollectionType where C.Generator.Element : Equatable>(domain: C,value: C.Generator.Element) -> C.Index?
func replaceObjectWithObject<C : RangeReplaceableCollectionType where C.Generator.Element : Equatable>(inout collection: C,obj1: C.Generator.Element,obj2: C.Generator.Element) { if let index = find(collection,obj1) { removeAtIndex(&collection,index) insert(&collection,obj2,atIndex: index) } } var myArray = [1,2,3,4,5] replaceObjectWithObject(&myArray,7) // 1,7,5
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。