【发布时间】:2021-03-22 22:43:24
【问题描述】:
我今天在看另一个 SO 问题时得到了一个惊喜:
let s = "1,a"
let arr = s.split(separator: ",")
let result = arr.compactMap{Int($0)} // ok
let result2 = arr.compactMap(Int.init) // error
为什么第 3 行合法而第 4 行不合法?我原以为“如果可能,将传入参数强制为 Int”这两种说法是完全等价的。
我知道第 4 行在 Subsequence 上卡住了,我知道如何摆脱困境:
let result2 = arr.map(String.init).compactMap(Int.init) // ok
我不明白为什么他们都不会以同样的方式窒息。
【问题讨论】:
-
.init真的初始化了吗? -
@aheze
Int(...)是Int.init。一个是电话,另一个是名字。用括号我们提供了一个函数的名称,这就是我正在做的事情。问题是,为什么这与我在花括号中使用的函数不完全相同。正如我所说,我可以旋转第 4 行来让它工作,我只是不明白为什么我必须这样做。 -
@matt,在评论之前没有注意到您的编辑 :)
-
这两个答案说明了原因。我发现有两个地方在我想使用时经常无法使用
.init,因为缺少重载。默认参数是一个,你在这里遇到了。另一个是自动关闭:stackoverflow.com/questions/34699576/… -
@Jessy 我仍然觉得在语言上很奇怪
Int()本身并不是Int.init的语法糖。我猜是因为函数引用的逻辑和语法不同;它必须是明确的。
标签: swift map-function