无法在属性初始化程序中使用实例成员'movies1',属性初始化程序在'self'可用之前运行

时间:2017-09-12 22:56:06

标签: ios uitableview

我正在开发一个可扩展的表视图并遇到了一些问题。

这适用于测试:

var sections = [
    ExpandTVSection(genre: "genre1", movies: ["movie1A", "movie1B","movie1C"], expanded: false),
    ExpandTVSection(genre: "genre2", movies: ["movie2A", "movie2B","movie2C"], expanded: false),
    ExpandTVSection(genre: "genre3", movies: ["movie3A", "movie3B","movie3C"], expanded: false)
]

我从Firebase获取数据,所以我尝试设置第一个电影名称

var movies1 = [String]()
var movies2 = [String]()
var movies3 = [String]()

func fetchMovies(){
    var datref: DatabaseReference!
    datref = Database.database().reference()
    datref.child("movies1").child("names").observe(
        .childAdded,
        with: {
            (snapshot) in         
                if let dictionary = snapshot.value as? [String: AnyObject]{
                    let movie = MoviesInfo(dictionary: dictionary)
                    movie.setValuesForKeys(dictionary)
                    self.movies1.append(movie.Name!)
                }
            },
        withCancel: nil)
}

// !! program breaks here due to movies1 !!

var sections = [
    ExpandTVSection(genre: "genre1", movies: movies1, expanded: false),
    ExpandTVSection(genre: "genre2", movies: ["movie2A", "movie2B","movie2C"], expanded: false),
    ExpandTVSection(genre: "genre3", movies: ["movie3A", "movie3B","movie3C"], expanded: false)
]

一旦我尝试应用它,我的程序崩溃了:

  

无法在属性初始值设定项中使用实例成员'movies1',   属性初始化程序在'self'可用之前运行

更多可能有用的信息:

struct ExpandTVSection {
    var genre: String!
    var movies: [String]!
    var expanded: Bool!

    init(genre: String, movies: [String], expanded: Bool) {
        self.genre = genre
        self.movies = movies
        self.expanded = expanded
    }
}

1 个答案:

答案 0 :(得分:1)

Swift不允许您在另一个属性(movies1)的初始化表达式中使用属性(sections)。相反,您可以在初始化程序中初始化属性(在调用超类初始化程序之后),或者在您的情况下执行:

ExpandTVSection(genre: "genre1", movies: [], expanded: false)

而不是

ExpandTVSection(genre: "genre1", movies: movies1, expanded: false)

由于您的movies1初始化为空数组。