简体   繁体   English

在init中的闭包内快速调用self

[英]swift call self inside closure in init

convenience init(title: String!,
    datePickerMode: UIDatePickerMode,
    selectedDate: Date!,
    origin view: UIView!) {

        self.init(title: title,
                  datePickerMode: datePickerMode,
                  selectedDate: selectedDate,
                  doneBlock: { [weak self] (_, date , _) in
                                guard let sself = self else { return }
                                sself.done.next(date as! Date)
                    }
            ,
            cancel: { [weak self] (_) in
                                guard let sself = self else { return }
                                sself.cancel.next()
                    }
            ,
            origin: view)

But I get compiler error:但我得到编译器错误:

'self' used before self.init call 'self' 在 self.init 调用之前使用

I worked it around, with first initializing with closure nil and setting right after.我解决了这个问题,首先用闭包 nil 初始化,然后立即设置。

convenience init(title: String!,
                 datePickerMode: UIDatePickerMode,
                 selectedDate: Date!,
                 origin view: UIView!) {

    self.init(title: title,
              datePickerMode: datePickerMode,
              selectedDate: selectedDate,
              doneBlock: nil,
              cancel: nil,
              origin: view)


    self.onActionSheetDone = { [weak self] (_, date , _) in
        guard let sself = self else { return }
        sself.done.next(date as! Date)
    }


    self.onActionSheetCancel = { [weak self] (_) in
        guard let sself = self else { return }
        sself.cancel.next()
    }

But I don't understand what the problem in doing it in first way.但我不明白以第一种方式这样做有什么问题。 Thanks for providing some information感谢您提供一些信息

In first condition, you used self before self had init in the closure.在第一种情况下,您在self在闭包中使用 init 之前使用了self This is not allowed.这是不允许的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM