闭包默认初始化程序丢失 - Swift闭包变量声明?

4

我在viewController类外声明了一个闭包,我在viewController类内创建了一个该闭包的变量,但它显示缺少此闭包的默认初始化器错误。

我了解变量和常量声明以及默认初始化必须在声明时分配的后果。但是我无法理解我的闭包的默认初始化可以是什么,我尝试了一些方法来解决它,但没有成功。

这是我的闭包声明:

typealias completionBlock = (String) -> ()  

这是我的闭包变量声明,提示需要初始化它。

class ViewController: UIViewController {

     var completionHandler: completionBlock = // What could be the default initializer to this closure

     override func viewDidLoad() {
         super.viewDidLoad()
     }
}

我希望能够在获取到必要的值时调用此代码块,就像Objective-C中外部completionBlock声明一样。

只需声明为 completionBlock?completionBlock!(如果您100%确定它将被设置)。 - luk2302
当我尝试调用 completionHandler("completion") 时,它会触发“fatal error: unexpectedly found nil while unwrapping an Optional value”错误。 - Kiran Jasvanee
2个回答

6
你有3个选项。
  • default property:

    var completionHandler : completionBlock = { _ in }
    
  • Implicitly unwrapped Optional - only do this when you are 100% sure a value will be set before ever calling the completionHandler:

    var completionHandler: completionBlock!
    
  • "regular" Optional

    var completionHandler: completionBlock?
    
    // later callable via
    completionHandler?("hi")
    

谢谢Luk,你的第一个案例 - 闭包默认属性,正是我想知道的。Luk,能再帮我一个忙吗?你能告诉我你是从哪里学习这些深入的知识的吗?因为我已经试图去探索苹果文档,但到目前为止都没有找到答案。 - Kiran Jasvanee
@KiranJasvanee 我没有在任何地方学习过,我开始回答Swift的问题并使用Swift编程。我没有阅读过任何教程。在你的情况下,你只需要提供一个闭包。闭包参数不重要,因此使用“_”,主体应该为空,这就是全部。 - luk2302
感谢 @luk2302。非常感激。 - Kiran Jasvanee

1
我认为应该是这样的吗?
var completionHandler: completionBlock = { stringValue  in 
        // but your code here
    }

1
你好,Ismail。感谢你的回答。luk2302给出了我正在寻找的当前答案。我想知道闭包的默认初始化属性,对于数组来说是[],对于int来说是0。 - Kiran Jasvanee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接