【问题标题】:Let warning in nested CloudKit Query makes var never change让嵌套 CloudKit 查询中的警告使 var 永远不会改变
【发布时间】:2020-12-31 18:12:07
【问题描述】:

我在我的代码中收到警告“变量 'userArray' 从未发生变异;考虑更改为 'let' 常量”并且我的变量由于某种原因没有被更改?我包含了一些打印语句来尝试找出正在运行的内容和未运行的内容。以下是打印内容:“附加用户 - []”、“找到 [“测试用户”]”

static func getBossSubs(bossID: String, completion: @escaping (Result<UserNames, Error>) ->
    ()) {
    let pred = NSPredicate(format: "uniqueID = %@", bossID)
    let sort = NSSortDescriptor(key: "creationDate", ascending: false)
    let query = CKQuery(recordType: RecordType.Users, predicate: pred)
    query.sortDescriptors = [sort]
    
    let operation = CKQueryOperation(query: query)
    operation.desiredKeys = ["subscribedBosses"]
    operation.resultsLimit = 50
    
    operation.recordFetchedBlock = { record in
        DispatchQueue.main.async {
            guard let subs = record["subscribedBosses"] as? [String] else {
                print("Error at screenName")
                
                completion(.failure(CloudKitHelperError.castFailure))
                return
            }
            var userArray = UserNames() //Error that it should be a LET is here. 
            for boss in subs{
                CloudKitHelper.getBossScreenName(bossID: boss) { (result) in
                    
                    switch result{
                        
                    case .success(let name):
                        userArray.names.append(name) //works fine
                        print("Found \(userArray.names)") //Prints a name
                    case .failure(let er):
                        completion(.failure(er))
                    }
                    
                }
                print("does this run?") // Only runs if No Name
                completion(.success(userArray)) // contains no name or doesn't run?
            }
            
        }
    }
    operation.queryCompletionBlock = { (_, err) in
        DispatchQueue.main.async {
            if let err = err {
                completion(.failure(err))
                return
            }
        }
        
    }
    CKContainer.default().publicCloudDatabase.add(operation)
}

我这样调用代码:

.onAppear {
            // MARK: - fetch from CloudKit
            self.userList.names = []
            let myUserID = UserDefaults.standard.string(forKey: self.signInWithAppleManager.userIdentifierKey)!
            // get my subs projects
            CloudKitHelper.getBossSubs(bossID: myUserID) { (results) in
                switch results{
                    
                case .success(let user):
                    print("Users appended")
                    self.userList.names = user.names
                case .failure(let er):
                    print(er.localizedDescription)
                }
            }
        }

【问题讨论】:

  • 为了检查显而易见的,我假设您还没有在代码的其他地方定义 userArray 吗?并且您尝试过干净的构建/重新启动的 xcode?在 Playground 中测试了类似的代码,正如预期的那样,它要求它是一个 var,而不是 let。
  • 是的,这是唯一使用它的地方。重新启动也没有运气。

标签: ios xcode swiftui switch-statement cloudkit


【解决方案1】:

正如你所拥有的,userArray 是一个对象:

var userArray = UserNames()

当您将内容附加到对象的names 属性时,您并没有改变对象,而是更改了其中一个属性的内容。如果你不改变对象(即改变它的属性),你应该使用let

如果您像 Xcode 建议的那样将其更改为 let,是否会出现问题?

let userArray = UserNames()

【讨论】:

  • 这是有道理的。我想这不是它没有打印的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-09
相关资源
最近更新 更多