Swift中声明URL变量报错:无法在属性初始化器中使用实例成员
解决Swift中属性初始化时无法引用实例成员的问题
这个错误的核心原因是:Swift中实例属性的初始化顺序是在self完全创建之前完成的,所以你不能用一个实例属性(比如url)去初始化另一个实例属性(比如posts)——这时候self还没准备好,url也还没被初始化完成。
根据你想要硬编码数据的需求,这里有几个简单可行的解决方案:
方案1:直接在数组内创建URL实例
如果这个URL只在初始化posts的时候用到,最简单的方式就是直接把URL的创建写在数组里,不用单独声明url变量:
class UserSalonViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { @IBOutlet var allPostsTableView: UITableView! var posts = [ UserPosts( author: "Arturo", postTitle: "Hello World", postDescription: "First Post", postUrl: URL(string: "https://duckduckgo.com/")!, postAddress: "1 NW 1 ave" ) ] override func viewDidLoad() { super.viewDidLoad() // ... 其他代码 } }
方案2:将posts改为懒加载属性
如果这个url变量之后还要在其他地方用到,可以把posts声明为lazy var。懒加载属性会在第一次被访问的时候才初始化,这时候self已经完全创建,url也已经初始化完成:
class UserSalonViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { @IBOutlet var allPostsTableView: UITableView! let url = URL(string: "https://duckduckgo.com/")! lazy var posts = [ UserPosts( author: "Arturo", postTitle: "Hello World", postDescription: "First Post", postUrl: url, postAddress: "1 NW 1 ave" ) ] override func viewDidLoad() { super.viewDidLoad() // ... 其他代码 } }
方案3:将url改为静态属性
静态属性属于类本身,而不是实例,它的初始化不依赖self,所以可以直接在实例属性的初始化中引用:
class UserSalonViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { @IBOutlet var allPostsTableView: UITableView! static let url = URL(string: "https://duckduckgo.com/")! var posts = [ UserPosts( author: "Arturo", postTitle: "Hello World", postDescription: "First Post", postUrl: UserSalonViewController.url, postAddress: "1 NW 1 ave" ) ] override func viewDidLoad() { super.viewDidLoad() // 如果之后要在实例方法中使用url,需要写成 UserSalonViewController.url 或者 self.url // ... 其他代码 } }
你可以根据自己的实际需求选择最合适的方案:如果URL只在初始化数组时用,方案1最简洁;如果URL还要在其他实例方法中复用,方案2或3更合适。
内容的提问来源于stack exchange,提问作者Arturo
相关产品推荐
相关产品推荐

