2016-02-12 84 views
0

我想知道存储结构数组的最佳方式。存储一个类的结构阵列

我有一个Movie结构有一个名称和与之关联的图像

struct Movie { 
    var name = "" 
    var image = "" 
} 

Person谁拥有favouriteMovie,他/她只能从movies

的静态数组挑
class Person { 
    static let movies = [Movie(name: "movie 1", image: "movie-1.png"), 
     Movie(name: "movie 2", image: "movie-2.png")] 
    var movie = Movie() 
} 

这是存储结构数组的有效方法吗?

例如,我可以有许多Person实例正在启动和movies列表可能会增长。

var alex1 = Person() 
alex1.movie = movies[0] 
var alex2 = Person() 
alex2.movie = movies[0] 

... 

回答

2

这是更有效地只存储每个电影对象Person内部的密钥(索引,例如)一个比特。当然,您必须保证这些电影阵列不会使这些键无效,而无需重新映射所有对象。

我也会保留电影数组与电影对象。这更合乎逻辑。

struct Movie { 
    static let movies = [ 
    Movie(name: "movie 1", image: "movie-1.png"), 
    Movie(name: "movie 2", image: "movie-2.png")] 
    let name:String 
    let image:String 
} 


class Person { 
    var movieIndex:Int = 0 
    var movie:Movie? { 
    get { 
     return Movie.movies[movieIndex] 
    } 
    } 
} 

var alex1 = Person() 
alex1.movieIndex = 0 
var alex2 = Person() 
alex2.movieIndex = 1 

alex1.movie?.name // "movie-1.png" 
alex2.movie?.name // "movie-2.png" 
+0

谢谢。所以如果我是正确的'静态让电影= ...'只被调用一次,即我没有生成这个常量的重复实例 - 它只是引用一个副本? : -/ – Alex

+0

对,当你有一个'let'语句时,它只会被设置一次并且引用那个单个对象。这是一件好事,因为这是一个不太可能改变的东西,因为它是一个索引项目的商店。当你需要添加更多的时候,你可以更多地编程并将它们添加到最后。如果你需要更频繁的变化,那么你必须重新考虑这一点。 – ColGraff

+0

是的,它不会改变,如果它是我会硬编码它。这是在Swift中设置一个常量数组的“最干净”的方式(看起来有点麻烦)?为了清楚起见,我的意思是“静态”部分 - 这是否意味着它只引用原始结构而不是其实例? – Alex