首页 > 解决方案 > 如何使用户定义的运行时属性在 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= ”。

在任何替代方案中,我仍然可以在故事板中为类使用用户定义的运行时属性?谢谢你。

标签: swiftswift5xcode10.2

解决方案


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

此类不符合键类型的键值编码

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

@objc var type = String()

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


(但drawster的建议也很好。@IBInspectable使用与用户定义的运行时属性相同的机制@IBInspectable。如果您将某些东西标记为@objc自动在幕后标记(同样是这样@IBOutlet,它使用这种机制)。并且 Inspectable 属性给出您在 IB 中有一个更好的用户界面;您可以直接在属性检查器中设置您的属性,而不必弄乱用户定义的运行时属性表。)


推荐阅读