Skip to content

Instantly share code, notes, and snippets.

@pofat
Created October 19, 2019 05:15
Show Gist options
  • Save pofat/a411d785e593982868a54e140f48ad8f to your computer and use it in GitHub Desktop.
Save pofat/a411d785e593982868a54e140f48ad8f to your computer and use it in GitHub Desktop.
Use `Opaque Return Type` to erase type.
// 想像以下 function 定義在某一個 module 裡,外部無法決定也不依賴具體的型別 (此 func 你可以呼叫但裡面實作看不到)
func getIterator() -> some IteratorProtocol {
var state = (0, 1)
return MyAnyIterator { () -> Int in
let upcomingNumber = state.0
state = (state.1, state.0 + state.1)
return upcomingNumber
}
}
// 以下是我們在外部呼叫,在外面呼叫的人只知道它是 some IteratorProtocol
// 差別是在前例中用 generic struct 時你可以從 compiler 提示看到 `next()` 回傳的是 Int
// 這裡你只能看到 next() 回傳型別是 IteratorProtocol.Element
var someIterator = getIterator()
print(someIterator.next())
print(someIterator.next())
print(someIterator.next())
print(someIterator.next())
print(someIterator.next())
print(someIterator.next())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment