符合默认实现协议的类型的Swift最小实现

时间:2015-09-19 13:11:58

标签: swift

我正在尝试使自己的类型符合CollectionType。通过Swift 2.0中引入的协议扩展,现在可以只实现所需实例方法的一个子集,同时自动实现所有其他方法。但是我需要提供的最小方法子集是什么?

1 个答案:

答案 0 :(得分:9)

似乎最低要求是实施 Indexable协议。这是一个例子,没有一个 可以省略属性/方法而不会导致编译器错误:

struct MyCollectionType : CollectionType {

    var startIndex : Int { return 0 }
    var endIndex : Int { return 3 }

    subscript(position : Int) -> String {
        return "I am element #\(position)"
    }
}

SequenceType协议默认实现:

let coll = MyCollectionType()
for elem in coll {
    print(elem)
}
/*
I am element #0
I am element #1
I am element #2
*/

对于 mutable 集合类型,下标必须是可读/写的:

struct MyCollectionType : MutableCollectionType {

    var startIndex : Int { return 0 }
    var endIndex : Int { return 3 }

    subscript(position : Int) -> String {
        get {
            return "I am element #\(position)"
        }
        set(newElement) {
            // Do something ...
        }
    }
}

Swift 3的更新: CollectionType已重命名为 Collection,您必须实施一个额外的方法 “移动索引”(比较A New Model for Collections and Indices):

struct MyCollectionType : Collection {

    var startIndex : Int { return 0 }
    var endIndex : Int { return 3 }

    subscript(position : Int) -> String {
        return "I am element #\(position)"
    }

    func index(after i: Int) -> Int {
        guard i != endIndex else { fatalError("Cannot increment endIndex") }
        return i + 1
    }
}