Как я могу установить строковую переменную и сделать ее всегда строчными?
Я хочу установить строковую переменную и всегда держать ее в нижнем регистре.
Это мой код:
var alwaysLowercaseString : String? {
didSet{
alwaysLowercaseString = alwaysLowerCaseString!.lowercaseString
}
}
Но когда я использую это, это входит в бесконечный цикл. Как я могу решить эту проблему?
3 ответа
Решение
Я исправлен, это правильный подход. LeoDabus заслуживает похвалы за этот ответ:
var alwaysLowercaseString : String? {
didSet{
alwaysLowercaseString = alwaysLowercaseString?.lowercaseString
print(alwaysLowercaseString)
}
}
var alwaysLowercaseString : String? {
didSet{
if alwaysLowercaseString != alwaysLowerCaseString!.lowercaseString {
alwaysLowercaseString = alwaysLowerCaseString!.lowercaseString
}
}
}
Это проверяет, так что если строчная строка уже строчная, она не изменит значение alwaysLowercaseString
снова, чтобы ты не позвонил didSet
бесконечно. Это сломается после alwaysLowercaseString
установлен в нижнем регистре.
Начиная с Swift 5.1 появилась возможность использовать обёртки свойств. Грубо говоря, эта механика позволяет нам изменять значение каждый раз, когда оно устанавливается.
@propertyWrapper struct Lowercased {
var wrappedValue: String {
didSet { wrappedValue = wrappedValue.lowercased() } // here the magic happens
}
init(wrappedValue: String) {
self.wrappedValue = wrappedValue.lowercased() // we have to do it manually here because in init property observers are not triggered
}
}
final class Test {
@Lowercased var cantMakeMeUpperCase = ""
}
let test = Test()
test.cantMakeMeUpperCase = "CAN I?"
print(test.cantMakeMeUpperCase) // prints "can i?"