Свифт: Почему это неизменное?

swift immutability

239 просмотра

2 ответа

Можете ли вы сказать мне, почему этот код не работает?

У меня есть несколько массивов, [AnyObject]которые содержат UILabels и UITextForm. Это funcдолжно принять в качестве параметра массив и отключить все метки и текстовую форму. Я пробовал с картой, но все же у меня та же проблема, компилятор говорит мне, что или переменная является константой или неизменна.

func disableSectionForm(formSection section: inout [AnyObject]) {
    for i in 0...section.count {
        if section[i] is UILabel || section[i] is UITextField {
            section[i].isEnabled = false
        }
    }
}
Источник Размещён: 08.11.2019 11:23

Ответы (2)


4 плюса

Решение

Здесь много ошибок компиляции

Проблема № 1 (это всего лишь предложение)

inoutздесь не нужен, потому что вы не изменяете sectionмассив, вы вместо этого изменяете объекты внутри него.

Выпуск № 2

inoutДолжна идти перед именем пар (если вы используете Swift 2.2)

Выпуск № 3

Вы должны использовать selfпри сравнении с dynamicType

Выпуск № 4

Вы не можете писать, section[i].isEnabled = falseпотому что AnyObjectне имеет члена, isEnabledпоэтому вы должны сделать бросок

Выпуск № 5

Вы обращаетесь к индексу за пределами вашего массива, так что это

0...section.count

должен стать этим

0..<section.count

Версия кода № 1

Теперь ваш код выглядит так

func disableSectionForm(formSection section: [AnyObject]) {
    for i in 0..<section.count {
        if section[i].dynamicType == UILabel.self {
            (section[i] as? UILabel)?.enabled = false
        } else if section[i].dynamicType == UITextField.self {
            (section[i] as? UITextField)?.enabled = false
        }
    }
}

Версия кода № 2

Поскольку:

  1. Вы можете перебирать свои элементы более безопасным способом
  2. вы должны использовать conditional castвместоdynamicType comparation

Вы можете написать в

Swift 2.2

func disableSectionForm(formSection section: [AnyObject]) {
    section.forEach {
        switch $0 {
        case let label as UILabel: label.enabled = false
        case let textField as UITextField: textField.enabled = false
        default: break
        }
    }
}

Swift 3.0 (бета 6)

func disableSectionForm(formSection section: [Any]) {
    section.forEach {
        switch $0 {
        case let label as UILabel: label.isEnabled = false
        case let textField as UITextField: textField.isEnabled = false
        default: break
        }
    }
}

Кодовая версия № 3

Давайте определим протокол для представления классов со enabledсвойством Bool.

Swift 2.2

protocol HasEnabledProperty:class {
    var enabled: Bool { get set }
}

Давайте соответствовать этому UILabelиUITextLabel

extension UILabel: HasEnabledProperty { }
extension UITextField: HasEnabledProperty { }

И наконец...

func disableSectionForm(formSection section: [AnyObject]) {
    section.flatMap { $0 as? HasEnabledProperty }.forEach { $0.enabled = false }
}

Swift 3.0 (бета 6)

protocol HasEnabledProperty:class {
    var isEnabled: Bool { get set }
}

extension UILabel: HasEnabledProperty { }
extension UITextField: HasEnabledProperty { }

func disableSectionForm(formSection section: [Any]) {
    section.flatMap { $0 as? HasEnabledProperty }.forEach { $0.isEnabled = false }
}
Автор: Luca Angeletti Размещён: 20.08.2016 01:58

0 плюса

попробуйте проверить, если позволяют блокировать и использовать опциональные

func disableSectionForm(formSection section: inout [AnyObject]) {
            for i in 0...section.count {
                if let label = section[i] as? UILabel {
                     label.isEnabled = false
                }
                if let textField = section[i] as? UITextFiled {
                     textField.isEnabled = false
                }
            }
 }
Автор: Özgür Ersil Размещён: 20.08.2016 01:49
Вопросы из категории :
32x32