Создайте максимальную длину символа в UITextField, используя IBInspectable

Я хочу создать максимальную длину своего текстового поля с помощью IBInspectable, я вижу ответ на этот вопрос здесь, но я m получаю сообщение об ошибке Expression type '()' is ambiguous without more context,

Мой код был

import UIKit

private var __maxLengths = [UITextField: Int]()
extension UITextField {
    @IBInspectable var maxLength: Int {
        get {
            guard let l = __maxLengths[self] else {
               return 150 // (global default-limit. or just, Int.max)
            }
            return l
        }
        set {
            __maxLengths[self] = newValue
            addTarget(self, action: #selector(fix), for: .editingChanged)
        }
    }
    @objc func fix(textField: UITextField) {
        let t = textField.text
        textField.text = t?.prefix(maxLength)
    }
}

и я получаю сообщение об ошибке, указывающее на textField.text = t?.prefix(maxLength), с сообщением об ошибке Expression type '()' is ambiguous without more context,

Как я могу решить эту проблему?


person Dylan    schedule 03.06.2020    source источник
comment
Можете ли вы удалить аннотацию @objc перед func fix? Я думаю, что это вызывает эту ошибку.   -  person Sung-Jong Will Kim    schedule 03.06.2020
comment
@Sung-JongWillKim @objc требуется   -  person Leo Dabus    schedule 03.06.2020
comment
о, селектор связан.   -  person Sung-Jong Will Kim    schedule 03.06.2020


Ответы (1)


В Swift 5 метод prefix String возвращает значение типа String.SubSequence.

func prefix(_ maxLength: Int) -> Substring

Вам нужно преобразовать это в тип String.

Один из способов сделать это может быть:

let s = textField.text!.prefix(maxLength) // though UITextField.text is defined as an optional String, can be safely force-unwrapped as the default value is an empty string even when set to nil
textField.text = String(s)

или если вы предпочитаете однострочное решение:

textField.text = String(textField.text!.prefix(maxLength))
person dbn    schedule 03.06.2020
comment
Значение свойства UITextField text по умолчанию — пустая строка. Оставлять t необязательным бессмысленно - person Leo Dabus; 03.06.2020
comment
UITextField.text определяется как необязательная строка. Я просто придерживался исходного кода OP. открыть переменный текст: строка? // по умолчанию ноль - person dbn; 03.06.2020
comment
Значение свойства UITextField text НИКОГДА не будет равно нулю - person Leo Dabus; 03.06.2020
comment
Спасибо, что держишь меня честным. Действие «Перейти к определению» показывает устаревший комментарий в коде UITextField. я отредактирую ответ - person dbn; 03.06.2020