【问题标题】:Swift: Cannot use instance member 'trialGame' within property initializer; property initializers run before 'self' is availableSwift:不能在属性初始化程序中使用实例成员“trialGame”;属性初始化程序在“自我”可用之前运行
【发布时间】:2021-03-19 11:14:06
【问题描述】:

在我的 Swift ViewController 中,我有代码

class ViewController: UIViewController {
    
    var camera: UIButton!
    
    var gameBrowser: UICollectionView!
    let gameBrowserReuseID = "gamecell"
    
    var games: [Game]!
    
    
    let trialGame = Game(id: "5", title: "Dog", release_date: "1989", publisher: "Nintendo", price: "20", platform: "OS X", category: "Adventure", players: ["A", "B"])
    let trialGame2 = Game(id: "5", title: "Dog", release_date: "1989", publisher: "Nintendo", price: "20", platform: "OS X", category: "Adventure", players: ["A", "B"])
    
    games = [trialGame, trialGame2]

但是,在最后一行,我收到错误消息“无法在属性初始化程序中使用实例成员 'trialGame';属性初始化程序在 'self' 可用之前运行”(以及关于 trialGame2 的第二个错误)。我在其他论坛上搜索了这个错误,似乎这个错误一般是因为错误代码行中的一个或多个变量不能同时使用,但我不确定为什么会出现这种情况,因为我所做的只是将 Game 类的两个对象声明为常量。既然它们都是在我初始化数组游戏之前声明的,为什么它们都不可用?

大多数帖子建议在错误代码行前使用关键字“lazy”,因此: lazy var games = [trialGame, trialGame2] 但由于某种原因,编译器告诉我我需要对关键字lazy进行初始化。我不确定这意味着什么,编译器的唯一建议是删除关键字。

如果有帮助,这是我的游戏类:

import UIKit

class Game: Codable {
    var id: String!
    var title: String!
    var release_date: String!
    var publisher: String!
    var price: String!
    var platform: String!
    
    var category: String!
    var players: [String]!
    
    init(id: String, title: String, release_date: String, publisher: String, price: String, platform: String, category: String, players: [String]){
        self.id = id
        self.title = title
        self.release_date = release_date
        self.publisher = publisher
        self.price = price
        self.platform = platform
        self.category = category
        self.players = players
    }
}

我在这里感到非常迷茫,因为错误背后的原因和解决方案都让我无法理解。感谢您的帮助!

【问题讨论】:

    标签: ios swift cocoa-touch initialization computer-science


    【解决方案1】:

    首先,永远,永远不要将属性声明为使用非可选值初始化的隐式解包选项。去掉所有感叹号!

    要回答您的问题,您不能在类中的方法之外运行任意代码,为什么不简单

    class ViewController: UIViewController {
        
        var camera: UIButton!
        
        var gameBrowser: UICollectionView!
        let gameBrowserReuseID = "gamecell"
        
        var games = [Game(id: "5", title: "Dog", release_date: "1989", publisher: "Nintendo", price: "20", platform: "OS X", category: "Adventure", players: ["A", "B"]),
                     Game(id: "5", title: "Dog", release_date: "1989", publisher: "Nintendo", price: "20", platform: "OS X", category: "Adventure", players: ["A", "B"])]
        
      
    

    【讨论】:

    • 明白!只是为了澄清一点,所以我以后不会遇到同样的错误,什么是“任意代码”?为什么声明 Game 类的对象可以在 games 数组内部工作,但在声明为常量时不能在外部工作?谢谢!
    • 我的意思是任何引用self 的代码,除了声明行的左侧。
    猜你喜欢
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    • 2020-06-18
    • 2021-09-28
    相关资源
    最近更新 更多