Created
October 19, 2019 05:15
-
-
Save pofat/a411d785e593982868a54e140f48ad8f to your computer and use it in GitHub Desktop.
Use `Opaque Return Type` to erase type.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // 想像以下 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