我如何区分 Swift 中的通用值是什么?
例如,值“T”做什么,值“E”做什么?
func ??<T, E>(result: Result<T, E>, handleError: (E) -> T) -> T {
switch result {
case let .success(value):
return value
case let .failure(error):
return handleError(error)
}
}
Run Code Online (Sandbox Code Playgroud)
\n\n值“T”有什么作用,值“E”有什么作用?
\n
它们不是“值”,而是 \xe2\x80\x94类型的名称,与 String 或 Int 等术语相同。事实上,T 可以是String 或 Int。但 E 必须是某种类型的错误。
\n因此,出现两次的短语<T, E>仅表示 T 和 E 是其实际类型的通用占位符。当有人真正调用这个??函数时,调用者会弄清楚T和E到底是什么。这称为解析泛型。
因此,让我们想象一下,我们??以这样的方式调用,将 T 解析为 String,将 E 解析为 Error。然后在编译器的脑海中,我们将得到:
func ??(result: Result<String, Error>, handleError: (Error) -> String) -> String {\n switch result {\n case let .success(value):\n return value\n case let .failure(error):\n return handleError(error)\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n现在我们可以阅读函数声明了。它说:“你给我两个参数。一个,result:,必须是一个 Result 枚举,其成功类型为 String,失败类型为 Error。另一个,handleError:,必须是一个接受 Error 并返回 String 的函数。我将返回一个字符串给你。”
当然,这只是解析 T 和 E 的无数方法中的一种。它们代表将在编译时解析的真实??类型,具体取决于实际调用方式。这就是你的答案;这就是“他们所做的”。它们是占位符,代表将在编译时解析的实际类型。
事实上,为了演示,我将以将 T 解析为 String 并将 E 解析为 Error 的方式调用您的函数(尽管我将重命名您的函数myFunc以使名称合法):
func myFunc<T, E>(result: Result<T, E>, handleError: (E) -> T) -> T {\n switch result {\n case let .success(value):\n return value\n case let .failure(error):\n return handleError(error)\n }\n}\nenum MyError : Error { case oops }\nlet r = Result<String, Error> { throw MyError.oops }\nlet output = myFunc(result:r) { err in "Ooops" }\nprint(output) // Ooops\nRun Code Online (Sandbox Code Playgroud)\n脚注:请注意,您的函数无法真正被调用??,因为该名称已被使用。最好称呼它foo(在这些情况下通常是无意义的名称)。
| 归档时间: |
|
| 查看次数: |
131 次 |
| 最近记录: |