Как заставить пользовательский атрибут времени выполнения функционировать в xcode 10.2.1 и ios 12.2 - PullRequest
0 голосов
/ 30 апреля 2019

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

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

Key Path |Тип |Значение
тип |Строка |A

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=".

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

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

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

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

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

@objc var type = String()

Ваш код будет работать так же, как и раньше.


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

0 голосов
/ 30 апреля 2019

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

@IBInspectable var type = String()
...