Протокол Swift, использующий структуру со статическим свойством чтения и записи, не соответствует?

Почему это не компилируется в Swift 1.2?

protocol Proto {
    static var name : String {get set}
}
struct Struct : Proto {
    static var name : String = "name"
}

(В Swift 1.1 просто замените class на static внутри объявления протокола. Та же проблема.)

Компилятор жалуется, что я не соблюдаю протокол. Но почему я нет? Легко доказать, что статическое свойство name в Struct доступно как для чтения, так и для записи, так что я, безусловно, удовлетворил дух протокола.

У меня есть несколько дополнительных наблюдений:

  • Если я удалю set из требования протокола, проблема исчезнет.

  • Если я оставлю set на месте, но удалю static (или class) из требования протокола и static из реализации Struct, проблема исчезнет.

  • Если я оставлю static на месте и превращу сохраненную переменную в вычисляемую, проблема исчезнет.

  • Если я изменю структуру на класс, проблема исчезнет.

Но я не приблизился к пониманию того, что компилятору не нравится в том, что у меня есть. Почему статическое сохраненное свойство не удовлетворяет требованиям протокола?


person matt    schedule 19.02.2015    source источник
comment
Мне это кажется ошибкой в ​​компиляторе. Если вы используете class вместо struct, он работает на Swift 1.2.   -  person fz.    schedule 19.02.2015
comment
Да, я сказал это в вопросе (4-й пункт). А теперь скажи мне то, чего я еще не знаю! :) - Мне трудно поверить, что это баг. Если бы это было так, оно было бы очень старым, и я ожидал бы, что к настоящему времени он уже исправлен.   -  person matt    schedule 19.02.2015
comment
Я голосую за ошибку компилятора. Еще один пункт для вашего списка: даже добавление пустого didSet обозревателя свойств решает проблему.   -  person Nate Cook    schedule 19.02.2015
comment
С этой штукой didSet это тоже действительно пахнет ошибкой. Вы уже отправили его, верно?   -  person rickster    schedule 19.02.2015
comment
Я не собирался сообщать об этом, но @NateCook определенно убедил меня. Это, что удивительно, ошибка, которая всегда была и никто не замечал. Не могу поверить, что все это время упускали что-то столь очевидное, но вот оно.   -  person matt    schedule 19.02.2015


Ответы (2)


Базовый корабль исправлен в 6.3 (6D543q):

protocol Proto {
    static var name : String {get set}
}

struct Struct : Proto {
    static var name : String = "name"
}

Struct.name = "Frodo"

println(Struct.name)

в настоящее время работает:

-> "Frodo"

(протестировано в Playgrounds) Действительно кажется, что static рассматривался как переменная let / const, но ваш случай теперь работает в 6.3 Beta 3. Я просто счастлив, что символы lldb не разорваны.

person Chris Conover    schedule 13.03.2015

На этом этапе пример Нейта Кука убеждает меня, что это не что иное, как ошибка в компиляторе Swift. Как он указывает, простое добавление пустого didSet наблюдателя к статической переменной позволяет коду компилироваться. Тот факт, что это может иметь значение, хотя и не имеет функциональной разницы, повсюду имеет "ошибку".

person matt    schedule 20.02.2015