2017-06-13 105 views
1

你好可以做這樣的回調嗎?我想作爲參數傳遞一個函數,以便在某個任務完成後可以運行回調函數。iOS中的回調swift 3

class ConnectBLE { 
    var callBackFunc:()->() 

    init(callFunc: @escaping() ->()){ 

     callBackFunc = callFunc 
    } 

    func runCallBackFunc() { 
     callBackFunc() 
    } 
} 
class DelegateARC { 
    private let object = ConnectBLE(callFunc: RaspakHC05) 

    func RaspakHC05() { 
     print("hello from a callback") 
    } 
} 

但是我有一個錯誤。 無法將類型的價值 '(DelegateARC) - >() - >()' 到期望的參數類型 '() - >()'

+0

爲什麼會打印消息出來?沒有電話回撥? – Rob

+1

@Rob它不編譯。 – Mikhail

+2

它不起作用,因爲您不能在非惰性屬性初始值設定項中引用'self',因爲它們是在對象初始化之前運行的。嘗試:'私人懶惰var對象:ConnectBLE = ConnectBLE(callFunc:self.RaspakHC05)' – dan

回答

1

另一種方法(使用可選的延遲給object其真正的價值,直到初始化,否則完全代替):

class ConnectBLE { 
    var callBackFunc:()->() 

    init(callFunc: @escaping() ->()){ 

     callBackFunc = callFunc 
    } 

    func runCallBackFunc() { 
     callBackFunc() 
    } 
} 
class DelegateARC { 
    private var object : ConnectBLE! //* 

    init() { 
     self.object = ConnectBLE(callFunc: RaspakHC05) // * 
    } 

    func RaspakHC05() { 
     print("hello from a callback") 
    } 
} 
1

你試圖傳遞一個function,而不是一個closure。你必須使用一個closurelazy instantiation,使其工作:

class DelegateARC { 
    private lazy var object: ConnectBLE = { 
     return ConnectBLE(callFunc: self.RaspakHC05) 
    }() 

    var RaspakHC05:() ->() { 
     return { 
      print("hello from a callback") 
     } 
    } 
} 
3

您不能要求selfRaspakHC05)類的頂級運行非懶代碼。

除此之外,你必須撥打runCallBackFunc()ConnectBLE某處執行關閉。

你可以這樣做(在操場)

class ConnectBLE { 
    var callBackFunc:()->() 

    init(callFunc: @escaping() ->()){ 
     callBackFunc = callFunc 
    } 

    func runCallBackFunc() { 
     callBackFunc() 
    } 
} 
class DelegateARC { 

    init() { 
     ConnectBLE(callFunc: RaspakHC05).runCallBackFunc() 
    } 

    func RaspakHC05() { 
     print("hello from a callback") 
    } 
} 


DelegateARC() // prints "hello from a callback"