尽管声明明确,但 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