Swift — Getter и Setter для вычисляемых свойств как тип String

Здравствуйте, я действительно новичок в разработке Swift без опыта работы с Objective-C, хотя у меня есть сильные основы в java, у Swift очень жесткая кривая обучения для меня, ну, я перейду прямо к своему вопросу, но сначала опубликую код

 class Vehicle {

    var gear : String {

        get {
            return self.gear
        }

        set {
            self.gear = newValue
        }
    }
}

var vehicle = Vehicle()
vehicle.gear = "ADASD"

у меня ошибка компилятора, говорящая

./run-swift: line 18: 30295 Segmentation fault: 11  gtimeout -k $TIMEOUT_KILL_AFTER $TIMEOUT_DURATION $SWIFT_COMPILER -target $TARGET -sdk $SDK $OPTIMIZATION_LEVEL $INPUT_FILE -o $OUTPUT_FILE

я действительно не понимаю, почему этот простой код не компилируется с использованием типа String, если я изменяю объявление переменной как тип Int и присваиваю значение ее свойству, у меня вообще нет проблем.


person Jeff    schedule 29.02.2016    source источник


Ответы (2)


self.gear здесь вызывает геттер для gear, который вызывает self.gear. Вы создали бесконечный цикл. У вас аналогичная ситуация с сеттером. Вам не нужно реализовывать get и set, если вы просто хотите сохранить свойство.

final class Vehicle {
    var gear : String
}

var vehicle = Vehicle()
vehicle.gear = "ADASD"
person Rob Napier    schedule 29.02.2016
comment
спасибо за ответ, но я тестирую кое-что с наблюдателями свойств (willSet/didSet) в наследовании от учебника по веб-сайтам, и я не понимаю, когда я пытался изменить передачу как тип Int и сделать это -> vehicle.gear = 2 print(vehicle.gear); , у меня вообще нет проблем, но вывод 140543825397248 , я действительно не понимаю внутреннюю семантику типов данных Swift. - person Jeff; 29.02.2016
comment
Я не могу воспроизвести эту работу правильно, если вы просто измените String на Int. Это было бы очень удивительно. Он может не так быстро рухнуть (или, возможно, вообще), поскольку Int не требует выделения памяти, но на самом деле он не должен работать. Это бесконечный цикл. Тот факт, что вы получаете странный ответ, вероятно, связан с тем, что вы переполняете свой стек (чего я и ожидал) и получаете результат мусора, а не сбой. - person Rob Napier; 29.02.2016
comment
извините, я не написал, где я скомпилировал код, я пользователь Windows, у меня нет Mac здесь, поэтому я просто использую их онлайн-компилятор swift, который находится здесь [ссылка] runswiftlang.com , если вы попытаетесь изменить передачу как тип Int и присвоить значение int, вы получите эти числа, и я не понимаю, почему :(, но спасибо, что дали мне подсказка. Это бесконечный цикл, у Swift очень-очень другая семантика, и для аспиранта Java это немного сложно. :( - person Jeff; 29.02.2016
comment
Вы получите эти ошибки, потому что когда вы переполняете стек (из-за вызова сеттера в бесконечном цикле), поведение не определено. Когда вы переполняете стек, дальше может произойти что угодно. Удалите ненужные get и set. - person Rob Napier; 29.02.2016
comment
спасибо, теперь я понимаю семантику наблюдателей свойств, я не понимал, что get и set Swift НЕ так просты, как мутатор и аксессоры Java, я не понимал, что вызов свойства сам, если он используется внутри своих собственных наблюдателей. Редактировать, Когда вы переполняете стек -› я надеюсь, что Swift может бросить мне Stackoverlow -_ - - person Jeff; 29.02.2016

некоторое дополнение к ответу Роба:

computed property - это просто входная дверь для некоторых резервных сохраненных переменных, в вашем случае правильный способ - сначала объявить stored variables и использовать computed property get set method для доступа к нему.

class Vehicle {
    private var _gear : String = ""
    var gear : String {
        get {
            return _gear
        }
        set {
            _gear = newValue
        }
    }
}
var vehicle = Vehicle()
vehicle.gear = "ADASD"

причина, по которой он не падает, когда он объявлен как Int, в первую очередь заключается в том, что у него недостаточно времени, чтобы вызвать переполнение, я пробовал, и мне потребовалось некоторое время, чтобы получить эту ошибку введите здесь описание изображения

person dispute    schedule 29.02.2016
comment
спасибо за код, это заставило меня понять, что что-то не так с кодом, который я сделал - person Jeff; 29.02.2016
comment
@Jeff Джефф, я обновляю ответ, нет причин, по которым Int не сбой - person dispute; 29.02.2016