如何使用户定义的运行时属性在 xcode 10.2.1 和 ios 12.2 中起作用

How to make user defined runtime attribute functioned in xcode 10.2.1 and ios 12.2

我正在将代码转换为 Swift 5,因为 Xcode 10.2.1 将不再支持 Swift 3.

我在故事板中有一个用户定义的运行时变量。它在 Swift 3 中有效,但在 Swift 5 中无效。

Key Path | Type | Value
type | String | 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 return “http://example.com/Main.php?type=A”。 但是在 Swift 5 中, url 的实际输出只是 return "http://example.com/Main.php?type=".

还有什么替代方案我仍然可以在 class 的故事板中使用用户定义的运行时属性?谢谢。

您需要执行以下操作:

@IBInspectable var type = String()

您应该会在控制台中看到一条错误消息:

this class is not key value coding-compliant for the key type

这个错误是问题的线索。用户定义的运行时属性通过 Objective-C / Cocoa 功能、键值编码来工作。这要求 Objective-C 能够 看到 您尝试设置的 属性。在现代 Swift 中,您可以通过使用 @objc 属性标记自定义 属性 以供 Objective-C 访问:

@objc var type = String()

您的代码将像以前一样工作。


(但是 drewster 的建议也很好。@IBInspectable 使用 与用户定义的运行时属性相同的机制。如果您将某些内容标记为 @IBInspectable在引擎盖下自动标记为 @objc@IBOutlet 也是如此, 使用此机制)。并且 Inspectable 属性 在 IB 中为您提供了更好的用户界面;您可以直接在属性检查器中设置 属性,而不必弄乱用户定义的运行时属性 table。)