2015-11-11 4 views
1

хочу создать OptionSetType с пользовательское свойство добавляется в структуры:Swift OptionSetType сбрасывает пользовательские свойства

struct Options: OptionSetType { 

    let rawValue: Int 

    init(rawValue: Int) { 
     self.rawValue = rawValue 
    } 

    // some option 
    static let opt = Options(rawValue: 1) 

    // custom stored property 
    var a = 0 

} 

Обычай свойство получает сброс каждый раз, когда методы Протокола OptionSetType в insert или remove называются:

var x: Options = [] 

x.rawValue // => 0 
x.a = 1 // => 1 

x.insert(.opt) 
x.rawValue // => 1 
x.a // => 0 <-- a is changed 

Я думаю, что insert(_:) делает что-то вроде этого:

self = Options(rawValue: newValueWithInsertedOption) 

Сбрасывает структуру. Есть ли способ сохранить сохраненное значение?

ответ

0

В настоящее время это кажется невозможным, обходным путем является обернуть OptionSetType в другой пользовательский struct/class, который содержит настраиваемые свойства.

0

Структуры передаются по значению (копирование), Классы по ссылке. Это, конечно, может быть болью, чтобы держаться прямо.

При запуске x.insert(.opt), вы инициализация новой структуры, состоящих из Options(rawValue: 1) и скопировать исходное значение a, а не проведение через ссылку, которые могут быть предварительно установлены.

Итак, если вы уже ранее установленные a к 1 в вашем коде, вставка затем инициализирует новую структуру и a затем возвращается к 0.

Заканчивать это прекрасное объяснение значения STRUCT проходящего для получения дополнительной информации: https://stackoverflow.com/a/26006268/4228039

Структура не предназначена для хранения сохраненных ссылок, которые продолжаются на каждую инициализации, но больше для установки начальных значений, которые передаются в. Классы будут работать лучше для этого.

+0

Спасибо за ваш ответ. Я знаю, что structs являются типами значений, но обычно, когда вы вызываете метод 'mutating' на struct, все значения в структуре также будут скопированы. Для 'OptionSetType' это не тот случай, когда вы вызываете' insert'. Единственный способ, которым я могу придумать эту работу, - создать оболочку, содержащую структуру 'Options', но мне бы очень понравилось более чистое решение – floorish

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