【问题标题】:How to create an immutable array of struct instances as an instance variable in Swift?如何在 Swift 中创建一个不可变的结构实例数组作为实例变量?
【发布时间】:2017-01-27 18:24:56
【问题描述】:

当我尝试创建以下 songs 数组时,我收到错误:

“不能在属性初始化器中使用实例成员 'song';属性初始化器在 'self' 可用之前运行”

class ViewController: UIViewController {
    struct Song {
        let title: String
    }
    let song = Song(title: "A")
    let songs = [song]
}

我可以将let songs = [song] 移动到viewDidLoad(),但是我无法从其他功能访问songs。我可以将let 更改为var,然后将viewDidLoad() 中的songs 更改为我的歌曲数组,但是当我希望它不可变时,我创建了一个可变数组。

如何获得可用于所有功能的不可变歌曲数组,并且仍然让每首单独的歌曲在其自己的常量中可用?

【问题讨论】:

标签: swift


【解决方案1】:

您可以通过在初始化期间创建歌曲数组来实现此目的。

class ViewController: UIViewController {
    struct Song {
        let title: String
    }
    let song = Song(title: "A")
    let songs : [Song]

    required init?(coder aDecoder: NSCoder) {
        self.songs = [self.song]
        super.init(coder: aDecoder);
    }
}

【讨论】:

  • 不知道可以在声明常量后为其赋值。谢谢!
【解决方案2】:

鉴于song 是一个常量,一个简单的解决方案就是将其设为static 属性:

class ViewController: UIViewController {
    struct Song {
        let title: String
    }
    static let song = Song(title: "A")
    let songs = [song]
}

如果你需要在任何实例方法中访问它,你可以说ViewController.song

【讨论】:

    【解决方案3】:

    要制作歌曲类型数组并添加歌曲,您应该:

    var songs = [Song]()
    

    并在视图中加载:

    songs.append(song)
    

    原来是这样:

    class ViewController: UIViewController {
        struct Song {
            let title: String
        }
        let song = Song(title: "A")
        var songs = [song]
    
       override func viewDidLoad() {
            super.viewDidLoad()
            songs.append(song)
    
        }
    }
    

    另一个保持它不可变的选项:

    let unmutableSongs: [Song] = [Song(title: "A")]
    

    【讨论】:

    • 正如我在问题中提到的,我不想将其设为 var,因为我希望歌曲是不可变的。
    • 然后你可以这样做:让 unmutableSongs: [Song] = [Song(title: "A")] 并且它有效!
    • 是的,它有效,但正如我所提到的,我还希望通过它们的名称访问单个歌曲常量。
    • 所以像这样访问:unmutableSongs[0].title 不能满足您的需要?
    猜你喜欢
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    相关资源
    最近更新 更多