数组 – Swift Array.insert泛型

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

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...