首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在将变量或常量声明设置为结尾为“()”的闭包中,每次访问变量时是否执行闭包?

在将变量或常量声明设置为结尾为“()”的闭包中,每次访问变量时是否执行闭包?
EN

Stack Overflow用户
提问于 2022-04-05 06:49:32
回答 1查看 31关注 0票数 -1

在Swift中的下面的代码中,每次调用变量‘整型’时还是在声明变量时执行闭包?

代码语言:javascript
复制
let integer: Int = {
    return 1
}()

有人知道那()叫什么吗?当我省略它时,会出现一个代码时错误,它告诉错误是什么,但它将()简单地称为'()',而不告诉我这个错误是什么,也没有告诉我,当将'()‘放在上面的示例代码中时,它称为’()‘做什么。

函数生成预期的类型'Int';您是想用'()‘来调用它吗?

以下代码是我在实际代码中使用()用于生产的地方,如果有人想知道的话:

代码语言:javascript
复制
var sharableZoneID = CKRecordZone.ID(zoneName: DatabaseNameStrings.recordZoneName, ownerName: CKCurrentUserDefaultName)

var userRecordID: CKRecord.ID? = {
    
    var localUserRecordID: CKRecord.ID? = nil
    
    containerCourier.fetchUserRecordID() {
        
        (recordID: CKRecord.ID?, error: Error?) in
        
        if let error = error {
            print(error.localizedDescription)
        }
        
        if let recordID = recordID {
            localUserRecordID = recordID
            sharableZoneID = CKRecordZone.ID(zoneName: DatabaseNameStrings.recordZoneName, ownerName: recordID.zoneID.ownerName)
        } else {
            print("couldn't get current user record id")
        }
        
    }

    return localUserRecordID
    
}()
EN

回答 1

Stack Overflow用户

发布于 2022-04-05 07:06:43

首先,您需要使它成为一个计算属性,而不是一个闭包。

代码语言:javascript
复制
var sharableZoneID = CKRecordZone.ID(zoneName: DatabaseNameStrings.recordZoneName, ownerName: CKCurrentUserDefaultName)

var userRecordID:CKRecord.ID? = {
    
    var localUserRecordID: CKRecord.ID? = nil
    
    containerCourier.fetchUserRecordID() {
        
        (recordID: CKRecord.ID?, error: Error?) in
        
        if let error = error {
            print(error.localizedDescription)
        }
        
        if let recordID = recordID {
            localUserRecordID = recordID
            sharableZoneID = CKRecordZone.ID(zoneName: DatabaseNameStrings.recordZoneName, ownerName: recordID.zoneID.ownerName)
        } else {
            print("couldn't get current user record id")
        }
        
    }

    return localUserRecordID
    
}

第二,调用containerCourier.fetchUserRecordID() {是异步的,所以这个计算属性总是返回零,所以您需要这样做

代码语言:javascript
复制
func getId(completion:@escaping((CKRecord.ID?) ->()))  {
    
    var sharableZoneID = CKRecordZone.ID(zoneName: DatabaseNameStrings.recordZoneName, ownerName: CKCurrentUserDefaultName)
   
    containerCourier.fetchUserRecordID() {
        
        (recordID: CKRecord.ID?, error: Error?) in
        
        if let error = error {
            print(error.localizedDescription)
            completion(nil)
        }
        
        if let recordID = recordID { 
            sharableZoneID = CKRecordZone.ID(zoneName: DatabaseNameStrings.recordZoneName, ownerName: recordID.zoneID.ownerName)
            completion(recordID)
        } else {
            print("couldn't get current user record id")
            completion(nil)
        }
        
    }
    
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71747352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档