Как заставить определенный пользователем атрибут времени выполнения функционировать в xcode 10.2.1 и ios 12.2

Я конвертирую коды в Swift 5, поскольку Xcode 10.2.1 больше не поддерживает Swift 3.

У меня есть определяемые пользователем переменные времени выполнения в раскадровке. Он работал в Swift 3, но не в Swift 5.

Ключевой путь | Тип | Значение
тип | Строка | А

class Mains: UITableViewController, XMLParserDelegate {
  ...    
  var type = String()
  ...

  func loadBuses(){

    let url:String="http://example.com/Main.php?type="+type
    let urlToSend: URL = URL(string: url)!
    ...
  }

  ...
}

В Swift 3 он работал, и URL-адрес возвращал "http://example.com/Main.php?type=A ". Но в Swift 5 фактический вывод url просто возвращает "http://example.com/Main.php?type= ".

Есть ли какие-либо альтернативы, которые я все еще могу использовать определяемые пользователем атрибуты времени выполнения в раскадровке для класса? Спасибо.


person Chu Man Ki Morris    schedule 30.04.2019    source источник
comment
Попробуйте объявить type как @objc.   -  person Rudedog    schedule 30.04.2019


Ответы (2)


Вы должны увидеть сообщение об ошибке в консоли:

этот класс не соответствует кодированию значения ключа для типа ключа

Эта ошибка - ключ к разгадке проблемы. Атрибуты времени выполнения, определяемые пользователем, работают с помощью функции Objective-C / Cocoa, кодирования «ключ-значение». Для этого требуется, чтобы Objective-C мог видеть свойство, которое вы пытаетесь установить. В современном Swift вы должны сделать настраиваемое свойство доступным для Objective-C, пометив его атрибутом @objc:

@objc var type = String()

После этого ваш код будет работать так же, как и раньше.


(Но предложение Дрюстера тоже хорошее. @IBInspectable использует тот же механизм, что и определяемые пользователем атрибуты времени выполнения. Если вы отметите что-то как @IBInspectable, оно автоматически помечается как @objc под капотом (то же самое верно и для @IBOutlet, который также использует этот механизм). А свойство Inspectable дает вам гораздо более удобный пользовательский интерфейс в IB; вы можете установить свое свойство непосредственно в инспекторе атрибутов, вместо того, чтобы возиться с таблицей определяемых пользователем атрибутов времени выполнения. .)

person matt    schedule 30.04.2019

Вам нужно сделать что-то вроде:

@IBInspectable var type = String()
person drewster    schedule 30.04.2019