Swift开发报错:Cannot use instance member 'haberUrl' within property initializer 如何解决
解决Swift中"Cannot use instance member within property initializer"错误
这个问题我刚入门Swift的时候也踩过坑!咱们先来搞懂为啥会报错:
在Swift里,当你在类/结构体的顶层直接定义并初始化属性时,所有属性的初始化器都是在self完全创建好之前运行的。这时候你直接用haberUrl去初始化newsUrl,相当于在self还没准备好的时候就去引用它的成员,Swift肯定会拦着你呀~
下面给你三种常用的解决办法,按需选就行:
1. 用懒加载属性(最适合静态场景)
如果haberUrl初始化后不会频繁变动,用lazy var让newsUrl在第一次被访问时才初始化,这时候self已经完全可用了:
var haberUrl = String() lazy var newsUrl: URL? = URL(string: haberUrl)
⚠️ 注意:URL(string:)返回的是可选类型,所以newsUrl要声明成URL?,别强制解包哦,不然遇到无效URL会崩溃。
2. 在初始化方法里创建newsUrl
如果haberUrl是需要在初始化时确定的,把属性初始化逻辑挪到init里,确保haberUrl先被初始化:
var haberUrl: String var newsUrl: URL? // 无参数初始化 init() { haberUrl = "" newsUrl = URL(string: haberUrl) } // 或者带外部参数的初始化(更灵活) init(haberUrl: String) { self.haberUrl = haberUrl self.newsUrl = URL(string: haberUrl) }
3. 用计算属性(适合动态场景)
如果haberUrl会随时被修改,想要newsUrl自动跟着更新,就把它改成计算属性:
var haberUrl = String() var newsUrl: URL? { // 每次访问newsUrl时,都会用当前的haberUrl生成新的URL URL(string: haberUrl) }
这样只要haberUrl变了,下一次访问newsUrl就会拿到最新的结果啦~
内容的提问来源于stack exchange,提问作者user8202800
相关产品推荐
相关产品推荐

