【问题标题】:Self captured by a closure before all members were initialized在所有成员初始化之前由闭包自我捕获
【发布时间】:2018-01-18 18:14:05
【问题描述】:

我的 ViewController 看起来像这样:

class ViewController: UIViewController {

... (Optional Variables declared)

var geoLoc: CLLocationCoordinate2D?

override func viewDidLoad() {
... (Optional Variables initialized)
        geocoder.geocodeAddressString(addressString) { (placemarks, error) in
            self.geoLoc = placemarks?[0].location?.coordinate
        }

}

}

我收到此错误:

'self' captured by a closure before all members were initialized

我尝试了许多死胡同,但根本找不到问题的原因。有什么建议吗?

【问题讨论】:

  • 您在 ViewController 中还创建了哪些其他属性?类的所有属性都必须先初始化,然后才能在类中的任何位置使用 self。
  • 这看起来不像你应该得到这个错误的地方。您确定此代码不在init 中吗?您是否实现了自定义init?这真的是错误出现的地方吗?在viewDidLoad 看到这个错误很奇怪。
  • 这是一种奇怪的行为。 Swift 应该输出错误消息:'self' 在所有成员被初始化之前由闭包捕获 仅在初始化程序中。看来你遗漏了太多。 (例如,您的班级缺少: UIViewController。)请显示更多可以重现您的问题的代码。
  • @OOPer 似乎问题在于 Xcode 将我的其他变量视为未初始化(即使它们已在此代码上方初始化),因此它不允许我在类上使用 self 前缀.解决此问题的方法是为我的变量提供默认值。
  • 感谢您的报告。如果您可以在您的问题中包含足够的代码来重现,那么该报告对于更多的开发人员来说会更有价值。

标签: swift swift3 core-location


【解决方案1】:

问题是您的类中有一些变量仅在调用捕获时被声明,但未初始化,您指的是self

声明一个变量:var a: Int和初始化它:var a:Int = 0var a:Int? = nil是不一样的。

你的类的所有变量都需要初始化(给定一个初始值),然后你才能引用self

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2022-01-15
    • 1970-01-01
    相关资源
    最近更新 更多