我是一個新手,也許這是一個愚蠢的問題,但我需要一些幫助。我有如下代碼,但我想知道是否應該洗掉 checkSignedIn 函式中的“@escaping”。
Class A{
public func checkSignedIn(complete: @escaping (Bool) -> Void) {
_ = Amplify.Auth.fetchAuthSession { (result) in
do {
let session = try result.get()
complete(session.isSignedIn)
} catch {
print("Fetch auth session failed with error - \(error)")
complete(false)
}
}
}
我想如果我將 complete() 分配給如下所示的變數,則使用“@escaping”將從閉包中轉義回傳值。
Class A{
var complete: (() -> Void)?
public func checkSignedIn(complete: @escaping (Bool) -> Void) {
_ = Amplify.Auth.fetchAuthSession { (result) in
do {
let session = try result.get()
self.complete = complete(session.isSignedIn)
} catch {
print("Fetch auth session failed with error - \(error)")
self.complete = complete(false)
}
}
}
然后我可以再次呼叫 A.complete。
我錯了嗎?如果你能教我這方面的知識,我將不勝感激。
uj5u.com熱心網友回復:
不,他們不會一樣。
該complete: @escaping (Bool) -> Void定義如下:
- 一個函式(或回呼),它接受 1 個引數 (
Bool),不回傳任何內容 (Void)。它等效于如下所示的函式:func complete(_ value: Bool) { } - 這個函式轉義了它傳遞給的函式的范圍,因為它異步運行(這是
@escaping關鍵字的意思)
然后這個函式被呼叫complete(session.isSignedIn),session.isSignedIn你傳入的布爾引數在哪里,就像函式的定義狀態一樣,函式什么都不回傳
該陳述句self.complete = complete(session.isSignedIn)不會編譯:
- 您定義
self.complete為(() -> Void)型別 - 即不帶引數且不回傳任何內容的函式或回呼。它相當于函式:func y() { } - 所以我們知道
complete(session.isSignedIn)回傳Void型別。將Void型別分配給(() -> Void)型別是行不通的。
如果你想保存轉義函式/回呼以在別處使用,你可以這樣做:
// Make sure signature of the variable matches that of a function argument
var complete: ((Bool) -> Void)?
public func checkSignedIn(complete: @escaping (Bool) -> Void) {
// Save callback at the start of the function
self.complete = complete
// Then continue to a asynch part of the code:
_ = Amplify.Auth.fetchAuthSession { (result) in
// Inside this callback, you still can use the function argument
complete(session.isSignedIn)
...
}
// But in another function, you have to use self.complete, e.g.:
func x() {
// Use saved callback. You don't have to say `self` here, just using it for clarity
self.complete(true)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/375492.html
下一篇:iOS13UIToolBar樣式
