#swift #properties #didset
#swift #свойства #didset
Вопрос:
Мне нужно, чтобы код didSet
выполнялся без изменения значения свойства.
Недавно из Objective-C, похоже, не существует setMyProperty()
.
Итак, я попытался:
self.myProperty = self.myProperty
что приводит к ошибке Assigning a property to itself
.
Потому myProperty
что, оказывается CGFloat
, я мог бы сделать:
self.myProperty = 0.0
который срабатывает didSet
и не влияет на значение, но он не показывает, что я хочу здесь сделать.
Есть ли способ вызвать didSet
более понятным / прямым способом?
Комментарии:
1. На мой взгляд
didSet
, как указывает название, означает, что для свойства установлено значение, поэтому попытка выполнить didSet без изменения значения не имеет смысла, и это делает ваш код неясным.
Ответ №1:
Попробуйте это:
self.myProperty = { self.myProperty }()
Ответ №2:
Вы могли бы сделать:
struct MyStruct {
var myProperty: CGFloat {
didSet {
myFunc()
}
}
func myFunc() { ... }
}
Здесь myFunc
будет вызываться, когда myProperty
установлено значение. Вы также можете вызвать myFunc
напрямую, например, в ситуации, когда вам требуется didSet
, чтобы вас вызвали.
Комментарии:
1. Я думал об этом, но продолжал искать «родную» конструкцию Swift. У меня
didSet
всего две строки, поэтому я не хотел просто добавлять функцию для этого.
Ответ №3:
didSet вызывается после того, как значение свойства уже было изменено. Если вы хотите вернуть его к предыдущему значению (что имеет тот же эффект, что и отсутствие изменения значения свойства), вам необходимо присвоить ему свойство ‘oldValue’. Пожалуйста, обратите внимание, что oldValue не является переменной, определенной вами, она предопределена.
var myProperty: CGFloat {
didSet {
myProperty = oldValue
}
}
Комментарии:
1. В большинстве случаев я действительно хочу изменения, но иногда мне просто нужно, чтобы didSet выполнялся без изменений.
Ответ №4:
Вы можете использовать кортеж Swift 3
var myProperty : (CGFloat,Bool) = (0.0, false){
didSet {
if myProperty.1 {
myProperty = (0.0, false) // or (oldValue.0, false)
//code.....
}else{
// code.....
}
}
}
myProperty = (1.0, true)
print(myProperty.0) //print 0.0
myProperty = (1.0, false)
print(myProperty.0) //print 1.0
myProperty = (11.0, true)
print(myProperty.0) //print 0.0
Комментарии:
1. Это технически интересно. Это потребовало бы изменения всего кода, который использует это свойство; не очень хорошо. Я приведу два других ваших ответа (дающих вам 20 баллов) в качестве благодарности за усилия и идею.