【问题标题】:Confusing Declaration with a Swift Completion Handler将声明与 Swift 完成处理程序混淆
【发布时间】:2021-10-14 23:24:06
【问题描述】:

我正在阅读 Armad Sahar 的教科书“iOS 14 Programming for Beginners”。 MapDataManager 类中有以下代码,我被困了好几天。

import Foundation
import MapKit

class MapDataManager: DataManager {

fileprivate var items: [RestaurantItem] = []

var annotations: [RestaurantItem] {
    return items
}

func fetch(completion:(_ annotations:[RestaurantItem]) ->()){
    if items.count > 0 { items.removeAll() }
    for data in load(file: "MapLocations") {
        items.append(RestaurantItem(dict: data))
    }
    completion(items)
}

func currentRegion(latDelta: CLLocationDegrees, longDelta: CLLocationDegrees) -> MKCoordinateRegion {
    guard let item = items.first else {
            return MKCoordinateRegion()
        }
        let span = MKCoordinateSpan(latitudeDelta: latDelta, longitudeDelta: longDelta)
        return MKCoordinateRegion(center: item.coordinate, span: span)
    }

}

我的问题是关于 fetch 功能。根据我的理解,fetch函数接受另一个函数作为变量,命名为completion,我应该在completion之后的:之后声明函数的“类型”,应该是@ 987654325@ 给我,因为我们尝试输入一个[RestaurantItem] 数组,然后复制并输出一个新的[RestaurantItem] 数组。

但现在看来(_ annotations:[RestaurantItem]) -> () 变成了完成函数的“类型”,输入变量类型是(_ annotations:[RestaurantItem]),在我看来根本不像一个类型。我以为类型可能是IntString[RestaurantItem] 等,_ annotations:[RestaurantItem] 类型到底是什么???

为什么返回参数Void ()?显然,完成处理程序有 return 关键字,它返回一个类型为 [RestaurantItem] 的项目!!!

请帮助...我是 Swift 新手,我周围没有朋友可以帮助我...

博斯科

【问题讨论】:

    标签: ios swift completionhandler computed-properties


    【解决方案1】:

    参数标签_ annotations:是语法糖。

    它是 Swift 2 遗留的,编译器只对实际类型感兴趣

    ([RestaurantItem]) -> ()
    

    带有参数 [RestaurantItem] 且没有返回类型的闭包。


    为了更清楚,这是写成函数的闭包

    func completion(_ annotations: [RestaurantItem]) {
       // do something with the restaurant items
    }
    

    【讨论】:

    • 谢谢!现在明白了,不知道遗产...!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    相关资源
    最近更新 更多