加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

数组 – 是否可以在Swift中创建一个限制为一个类的数组扩展?

发布时间:2020-12-14 05:26:11 所属栏目:百科 来源:网络整理
导读:我可以创建一个适用于例如字符串的数组扩展吗? 从 Swift 2开始,现在可以通过协议扩展来实现, 它为符合类型提供方法和属性实现 (可选择受其他约束限制). 一个简单的例子:为所有符合的类型定义一个方法 到SequenceType(例如Array),其中sequence元素是String
我可以创建一个适用于例如字符串的数组扩展吗?
从 Swift 2开始,现在可以通过协议扩展来实现,
它为符合类型提供方法和属性实现
(可选择受其他约束限制).

一个简单的例子:为所有符合的类型定义一个方法
到SequenceType(例如Array),其中sequence元素是String:

extension SequenceType where Generator.Element == String {
    func joined() -> String {
        return "".join(self)
    }
}

let a = ["foo","bar"].joined()
print(a) // foobar

无法直接为struct Array定义扩展方法,但仅适用于所有类型
符合某些协议(带有可选约束).所以一个
必须找到一个符合Array的协议,并提供所有必要的方法.在上面的示例中,即SequenceType.

另一个例子(How do I insert an element at the correct position into a sorted array in Swift?的变种):

extension CollectionType where Generator.Element : Comparable,Index : RandomAccessIndexType {
    typealias T = Generator.Element
    func insertionIndexOf(elem: T) -> Index {
        var lo = self.startIndex
        var hi = self.endIndex
        while lo != hi {
            // mid = lo + (hi - 1 - lo)/2
            let mid = lo.advancedBy(lo.distanceTo(hi.predecessor())/2)
            if self[mid] < elem {
                lo = mid + 1
            } else if elem < self[mid] {
                hi = mid
            } else {
                return mid // found at position `mid`
            }
        }
        return lo // not found,would be inserted at position `lo`
    }
}

let ar = [1,3,5,7]
let pos = ar.insertionIndexOf(6)
print(pos) // 3

这里的方法被定义为CollectionType的扩展,因为需要下标访问元素,元素是要求是可比较的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读