尽管声明明确,但 Swift 中的 String 值不会改变 [重复]

Posted

技术标签:

【中文标题】尽管声明明确,但 Swift 中的 String 值不会改变 [重复]【英文标题】:Value of String won't change in Swift despite clear declaration [duplicate] 【发布时间】:2018-08-06 01:25:27 【问题描述】:

我正在制作一个应用程序,我必须在其中返回一个字符串,表示存在对我的 firebase 实时数据库的某个引用(出于其他原因,我没有使用 Bool)。尽管直接在上面和下面执行打印命令,但当我打印函数时,字符串的值不会改变并打印其默认值“Unchanged”。

我的代码:

func checkIfMovieHasAlreadyBeenShown(movieID: String) -> String 

    var hasItBeenSeen = "Unchanged"
    let uid  = Auth.auth().currentUser?.uid
    let ref = Database.database().reference()
    ref.child("Seen Movies").child(uid!).observeSingleEvent(of: .value, with:  (snapshot) in

        if snapshot.hasChild(movieID)
            print("The Result:")
            self.changeStringHasItBeenSeen(YNString: "yes")
            print("YES")
        

        else 
            print("The Result:")
            self.changeStringHasItBeenSeen(YNString: "no")
            print("NO")
        
    )

    return hasItBeenSeen

打印在这里:

print(checkIfMovieHasAlreadyBeenShown(movieID: "39"))
print(checkIfMovieHasAlreadyBeenShown(movieID: "38"))

【问题讨论】:

@Schemetrical 的答案确实是问题所在:当您的 return hasItBeenSeen 运行时,该值尚未加载。另见:***.com/questions/43854811/…、***.com/questions/43823808/…、***.com/questions/41262793/…、***.com/questions/42894472/… 【参考方案1】:

observeSingleEvent 在闭包中被调用。 return hasItBeenSeen 行不会受到闭包中的任何内容的影响,因为它将首先返回。

想象一下:你告诉你的朋友去买些苹果。在他离开之前,你问他要价。当然,他不会知道,因为他还没有去买苹果。

在调用闭包之后(或在购买苹果之后),您需要某种方式来执行某些操作。通常这可以通过一个完成处理程序来完成,您将一个闭包传递给您的checkIfMovieHasAlreadyBeenShown 函数,例如,“在您购买苹果之后执行此操作”。

然后你可以这样调用你的函数:checkIfMovieHasAlreadyBeenShown(movieID: "39", completion: seen in print(seen) )

【讨论】:

喜欢苹果的比喻。

以上是关于尽管声明明确,但 Swift 中的 String 值不会改变 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

尽管桥接头工作正常,但无法在 Swift 中实例化 Obj C 类

尽管宽度相等,但集合视图网格最后一行的显示方式不同 - swift iOS

Swift和Java关于集合类型的比较

尽管明确要求,但无法从 Google Plus 帐户获取私人生日

Swift初见Swift数组

如何在swift中保存核心数据中的值