2015-12-05 3 views
0

Это мой первый раз, когда я использовал singleton для совместного использования экземпляра объекта в swift. Кажется, что все работает отлично, за исключением тех случаев, когда я пытаюсь добавить элемент в массив (доступ из другого класса), который живет в моем одиночном объекте. Он действительно не добавляет никаких объектов в массив вообще. Я думаю, что он добавляется к массиву, но не к тому же экземпляру класса, который мне бы хотелось (поскольку мне нужен только один и только один экземпляр). Однако, если я добавляю элементы в массив из init() класса, все работает отлично. Вот код (я упростил все классы, чтобы сделать вещи более очевидны):Доступ к объекту singleton в swift

Файл 1:

class Brew: NSObject { 
    var method = Method() 

    //Singleton variable 
    private static var currentBrew: Brew? 

    //Method to get the current (and only) brew object 
    static func getCurrentBrew() -> Brew { 
    if currentBrew == nil { 
     currentBrew = Brew() 
    } 
    return currentBrew! 
    } 

} 

struct Method { 
    var chemex = Device() 

init() { 
    //If I append here - everything works fine 
    //chemex.instructions.append = (Instruction(title: "Prepare", direction: "Prewet & Heat", time: 3, water: 0)) 
} 

} 

struct Device { 
    var instructions = [Instruction]() 

init() { 
    instructions.append(Instruction(title: "None", direction: "None", time: 1, water: 0, index: 0)) 
} 

Файл 2: (где я хотел бы добавить в массив инструкций)

let brew = Brew.getCurrentBrew() //How i'm accessing the object 

//I'm calling this method from viewDidLoad to set up the array 
func setupBrewDevices() { 
    //This is the line that does not actually append to the singleton instance 
    brew.method.chemex.instructions.append(Instruction(title: "Extraction", direction: "Match water.", time: 8 , water: 25)) 

Просто боковое примечание. Я также попытался сделать метод, который добавит инструкцию в массив, который живет внутри одного и того же класса, но имеет тот же результат. Надеюсь, это достаточно ясно - я ценю любую помощь!

Спасибо, Коул

ответ

1

Существует лучший способ создать одноэлементный экземпляр в Swift.

class Brew: NSObject { 
    static let currentBrew = Brew() 

    var method = Method() 
} 

Это поточно-безопасный и позволяет избежать использования дополнительного оборудования.

При этом, когда я пробовал свой код, массив инструкций состоял из двух элементов, как я ожидал бы («Нет») и («Извлечение»). Проблема может быть в другом месте вашего кода.

+0

Добавление 'private init() {}' не позволяет кому-то инициализировать несколько экземпляров 'Brew'. Я также удалю часть ': NSObject'. –

+0

Отлично, спасибо за это. Я все еще работаю над решением, но хорошо устранить половину беспорядка. – Induction

Смежные вопросы