2017-06-13 113 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"