Как я могу установить строковую переменную и сделать ее всегда строчными?

Я хочу установить строковую переменную и всегда держать ее в нижнем регистре.

Это мой код:

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?"
Другие вопросы по тегам