我有一组CLPlacemark.我正在遵循和例子,我不明白为什么第二个代码是正确的.

例1:此代码是正确的.

let placemarks: [CLPlacemark]
....

placemarks
.compactMap({ placemark in
      Location(placemark: placemark)
})

...

例2:此代码也是正确的.

let placemarks: [CLPlacemark]
....

placemarks
.compactMap(Location.init(placemark:))

...

你知道为什么我不需要传递参数就可以创建位置吗?

推荐答案

初始化器可以被认为是一个常规函数,它返回初始化器正在初始化的任何类型的值.当您显式写出init时,它们有一个类型.

用同样的方式,你可以写:

func makeLocation(placemark: CLPlacemark) -> Location? { ... }
// I'm not *calling* `makeLocation` here - I'm just assigning the function itself to f
let f: (CLPlacemark) -> Location? = makeLocation(placemark:) // or just makeLocation

你也可以这样写:

struct Location {
    init?(placemark: CLPlacemark) { ... }
}
let f: (CLPlacemark) -> Location? = Location.init(placemark:) // or just Location.init

如果这是您第一次看到函数本身被用作value,而不是被调用,请参见this section of the Swift Guide.

compactMap年里,它也是这样运作的.compactMap需要类型(T) -> U?的函数,其中TU是类型参数.

你可以通过拉姆达{ placemark in Location(placemark: placemark) }米.这辆兰布达应该是(CLPlacemark) -> Location?型的.但Location.init的类型也是(CLPlacemark) -> Location?与此模式匹配,所以您也可以将其传递给compactMap.

Swift相关问答推荐

向文本元素添加背景色失败

如何在SWIFT中轻松格式化公制和英制使用的UnitVolume

依赖于@Environment的init@StateObject

SwiftUI - NavigationLink(value:)和navigationDestination不工作

如何将函数参数(字符串文字)标记为可本地化?

为什么无法在 Swift 中使用AVFoundation扫描 QRCode

DispatchQueue.main.asyncAfter 等同于 Swift 中的 struct 化并发?

如何在 macOS/AppKit 的窗口选项卡上接受拖动项目的放置?

如何从数据中读取以空结尾的字符串?

状态变量更改后,SwiftUI 视图不会更改

SwiftUI 分段 Select 器的问题

如何在 SwiftUI 中用图像替换占位符文本?

不使用 ViewController 时如何显示推送通知的alert 对话框

如何删除标签和步进按钮之间的间距是 SwiftUI Stepper?

如何有条件地格式化 SwiftUI 代码

在 Swift 中从 HTML 生成带有图像的 PDF 而不显示打印界面

在 Swift 中返回实例类型

Swift 2.0 中的 do { } catch 不处理从这里抛出的错误

自定义 Google 登录按钮 - iOS

滑动侧边栏菜单 IOS 8 Swift