Преобразование наблюдателя свойства Swift в ObjC - PullRequest
0 голосов
/ 10 марта 2019

Этот фрагмент кода ObjC имеет тот же результат, что и Swift?

var bottomColor = UIColor.gray {
    didSet {
        self.updateColors()
    }
}

против

- (void)setBottomColor:(UIColor *)bottomColor
{
    bottomColor = [[UIColor grayColor];
    if (_bottomColor != bottomColor) {
        _bottomColor = bottomColor;
        [self updateColors];
    }
}

Если нет, как я могу правильно перевести Swift?

Ответы [ 2 ]

3 голосов
/ 10 марта 2019

Два кода не совпадают.

В Swift наблюдатель свойства вызывается всякий раз, когда устанавливается значение. Неважно, равно ли новое значение старому значению или нет. Таким образом, этот код выведет «Hello» ровно дважды:

class A {
    var a: Int = 10 {
        didSet {
            print("Hello")
        }
    }
}

let a = A()
a.a = 10
a.a = 10

Чтобы преобразовать наблюдатель свойства в Objective-C, вам не нужно проверять, совпадает ли значение с прежним, просто выполните:

- (void)setBottomColor:(UIColor *)bottomColor
{
    _bottomColor = bottomColor;
    [self updateColors];
}

bottomColor должно быть установлено на [UIColor gray] в init.

0 голосов
/ 10 марта 2019

Нет!

В быстром коде bottomColor - это переменная, которая начинается с gray, и каждый раз, когда она изменяется (устанавливая другой цвет), запускается updateColors, но в коде target-cМетод просто запускает updateColors, если параметр не равен [UIColor grayColor]


Редактировать:

Вы можете реализовать быстрый код в target-c этимспособ:

• переопределить установщик и реализовать его самостоятельно.
• установить bottomColor = [UIColor grayColor] в иници.

- (void)setBottomColor:(UIColor *)bottomColor
{
    _bottomColor = bottomColor;
    [self updateColors];
}
...