2016-05-16 2 views
0

List и User - 2 класса. List содержит название и набор фильмов, которым может понравиться кто-то. Класс User имеет метод AddList(_: List). Добавить новый список фильмов на объект User типаКак создать общую часть между двумя объектами

class List { 
    var title : String = "General" 
    var movies = [String]() 

    init(title: String){ 
     self.title = title 
    } 

    init(title: String, movies: [String]){ 
     self.title = title 
     self.movies = movies 
    } 
} 

class User { 
    private let userID: Int 
    let userName: String 
    private var movieList = [String: [String]]() // the list is a Dictionaly, the value of the dictionalry is a string array 

    init(userID: Int, userName: String){ 
     self.userID = userID 
     self.userName = userName 
    } 

    func AddList(newMovieList: List) -> Dictionary<String, [String]> { 
     self.movieList.updateValue(newMovieList.movies, forKey: newMovieList.title) 
     return self.movieList 
    } 

} 

3 списка фильмов были beend inilizied как последовать

var actionMovieJhon = List(title: "Action", movies: ["The Equalizer", "Mad Max: Fury Road", "Star Wars"]) 
var actionMovieAnna = List(title: "Action", movies: ["Batman v Superman: Dawn of Justice", "American Sniper", "The Martia"]) 
var shareMovie = List(title: "ShareAction", movies: ["MovieA", "MovieB", "MovieC"]) 

А потом 2 User objdects Jhon и Anna с þér собственного списка фильмов были создан

var Jhon = User(userID: 1001, userName: "Jhon") 
var Anna = User(userID: 1002, userName: "Anna") 

Jhon.AddList(actionMovieJhon) 
Anna.AddList(actionMovieAnna) 

Вопрос: Как я могу добавить общий список фильмов (sharMovie) в диктатуру Jhon и Anna, так что все, что изменилось в общем списке Jhon, будет обновляться в сторону Anna и наоборот.

В словаре «словарь» Jhon и Anna имеет свою часть и общую информацию. Но общая часть ссылается на тот же объект списка

Больше Вопрос: У меня было чувство, что метод self.movieList.updateValue не update by reference

Большое спасибо за вашу помощь

+0

Потому что вы объявили 'list' как класс, он использует эталонную semanti CS. Поэтому, если вы назначаете один и тот же список для обоих пользователей, они могут изменить его. Все должно работать как есть. –

+0

Я пробовал немного, но я думаю, что 'self.movieList.updateValue' не обновляется по ссылке – SLN

ответ

0

код основан на sorece код, предоставляемый "Swift Apprentice, начиная с программирования Swift 2.2", глава 14: Классы

import Foundation 

class List { 
    let name: String 
    var movies: [String] = [] 

    init(name: String){ 
     self.name = name 
    } 

    func printList() { 
     print("Movie List: \(name)") 
     for movie in movies{ 
      print(movie) 
     } 
     print("\n") 
    } 
} 


class User { 
    var lists: [String: List] = [:]//**** 

    func addList(list: List){ 
     lists[list.name] = list 
    } 

    func listForName(name: String)-> List? { 
     print(lists[name]?.movies) 
     return lists[name] 
    } 

} 

//create user 
let jane = User() 
let john = User() 
let people = User() 

//create list 
var johnActionMovie = List(name: "ActionJhon") 
var janeActionMovie = List(name: "ActionJane") 
var sharedMovie = List(name: "SharedMovie") 
var publicIntrest = sharedMovie 

//call addList(_:) method on user object 
jane.addList(janeActionMovie) 
john.addList(johnActionMovie) 

jane.addList(sharedMovie) 
john.addList(sharedMovie) 
people.addList(publicIntrest) 


//private part appending 
jane.lists["ActionJane"]?.movies.append("janeA") 
jane.lists["ActionJane"]?.movies.append("janeB") 
jane.lists["ActionJane"]?.movies.append("janeC") 


john.lists["ActionJhon"]?.movies.append("johnA") 
john.lists["ActionJhon"]?.movies.append("johnB") 
john.lists["ActionJhon"]?.movies.append("johnB") 

//Shared part appending 
john.lists["SharedMovie"]?.movies.append("shareA") 
jane.lists["SharedMovie"]?.movies.append("shareB") 
people.lists["SharedMovie"]?.movies.append("shareC") 


//print out the result 
john.listForName("ActionJhon") 
john.listForName("SharedMovie") 

jane.listForName("ActionJane") 
jane.listForName("SharedMovie") 

people.listForName("SharedMovie") 


//further check 
print(jane.lists["ShareMovie"] === people.lists["ShareMovie"]) 
print(jane.lists["ActionJane"] === john.lists["ActionList"]) 
Смежные вопросы