开发者社区> 问答> 正文

数组扩展按值删除对象

extension Array { func removeObject (object: T) { var index = find(self, object) self.removeAtIndex(index) } } 但是,我得到一个错误 var index = find(self, object)

“ T”不可转换为“ T”

我也尝试使用此方法签名:func removeObject(object: AnyObject),但是,我得到了相同的错误:

“ AnyObject”不可转换为“ T”

正确的方法是什么?

问题来源于stack overflow

展开
收起
保持可爱mmm 2020-02-07 00:48:44 407 0
1 条回答
写回答
取消 提交回答
  • 从Swift 2开始,这可以通过协议扩展方法来实现。 如果集合的元素为:,则将其removeObject()定义为对所有符合RangeReplaceableCollectionType(特别是Array)的类型的方法Equatable:

    extension RangeReplaceableCollectionType where Generator.Element : Equatable {

    // Remove first collection element that is equal to the given `object`:
    mutating func removeObject(object : Generator.Element) {
        if let index = self.indexOf(object) {
            self.removeAtIndex(index)
        }
    }
    

    } 例:

    var ar = [1, 2, 3, 2] ar.removeObject(2) print(ar) // [1, 3, 2] 更新斯威夫特2 / Xcode的7测试版2:空速速度在评论中发现,现在其实可以写一个通用的类型,它是在模板更严格的方法,因此该方法可现在居然被定义为一个扩展的Array:

    extension Array where Element : Equatable {

    // ... same method as above ...
    

    } 协议扩展仍然具有适用于更大类型集的优点。

    Swift 3更新:

    extension Array where Element: Equatable {

    // Remove first collection element that is equal to the given `object`:
    mutating func remove(object: Element) {
        if let index = index(of: object) {
            remove(at: index)
        }
    }
    

    }

    2020-02-07 00:48:59
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载