官术网_书友最值得收藏!

Generics, protocols, and associated types

You can also use associated types in your protocols. These associated types let you define protocols that are generics, like this: RunnableWithResult. We can implement a bunch of logic and code around the run() method, without actually knowing anything about the return types. We'll encounter this construction many times in this book, so it's important that you're comfortable with associate types:

protocol RunnableWithResult {
associatedtype ResultType
func run() -> ResultType
}

struct RunnersWithResult<T>: RunnableWithResult where T: RunnableWithResult {
let runnables: [T]
func run() -> [T.ResultType] {
return runnables.map { $0.run() }
}
}

Like with generic types, you can't mix and match heterogeneous types. The following example will not compile; later in this book, you'll see strategies for overcoming this common problem when dealing with generics:

struct IntRunnable {
func run() -> Int {
return 0
}
}

struct StringRunnable {
func run() -> String {
return "OK"
}
}

let runnables: [RunnableWithResult] = [StringRunnable(), IntRunnable()]

This will yield the following dreaded error:

Protocol 'RunnableWithResult' can only be used as a generic constraint because it has Self or associated type requirements
主站蜘蛛池模板: 肥东县| 浮梁县| 洮南市| 攀枝花市| 永州市| 凤台县| 开封市| 吴堡县| 永寿县| 宜君县| 留坝县| 博乐市| 宝坻区| 同仁县| 中江县| 尉氏县| 三门峡市| 封丘县| 定襄县| 册亨县| 铜鼓县| 永年县| 同仁县| 黎川县| 开鲁县| 宁德市| 银川市| 江阴市| 永年县| 宿州市| 景洪市| 法库县| 江陵县| 南华县| 青铜峡市| 东平县| 兴山县| 九江县| 新田县| 建宁县| 莱芜市|