iOS swift 3中的回调

时间:2017-06-13 17:22:30

标签: ios swift

您好可以像这样进行回调吗?我想传递一个函数作为参数,以便在完成一些任务后能够运行回调函数。

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)的值 - > () - > ()'预期参数类型'() - > ()'

3 个答案:

答案 0 :(得分: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"

答案 1 :(得分:2)

另一种方法(使用Optional来延迟给予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")
    }
}

答案 2 :(得分: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")
        }
    }
}