swift - 如何使用户定义的运行时属性在 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= ”。
在任何替代方案中,我仍然可以在故事板中为类使用用户定义的运行时属性?谢谢你。
解决方案
您应该会在控制台中看到一条错误消息:
此类不符合键类型的键值编码
此错误是问题的线索。用户定义的运行时属性通过 Objective-C / Cocoa 特性、键值编码工作。这要求 Objective-C 能够看到您尝试设置的属性。在现代 Swift 中,您可以通过使用@objc
属性标记自定义属性来使 Objective-C 可以访问它:
@objc var type = String()
然后,您的代码将像以前一样工作。
(但drawster的建议也很好。@IBInspectable
使用与用户定义的运行时属性相同的机制@IBInspectable
。如果您将某些东西标记为@objc
自动在幕后标记(同样是这样@IBOutlet
,它也使用这种机制)。并且 Inspectable 属性给出您在 IB 中有一个更好的用户界面;您可以直接在属性检查器中设置您的属性,而不必弄乱用户定义的运行时属性表。)
推荐阅读
- blockchain - 我无法使用 ipfs
- android - 如何在 Android Studio“北极狐”版本中禁用特定类的检查
- go - golang:将 16 字节的 uuid 转换为 32 字节
- azure-cosmosdb - CosmosDB 获取嵌套子节点的数量
- r - 如何跨平台使用包含 Umlauts 的 R 脚本?
- c++ - 如何使用 openssl API 进行流式 CMS 签名操作
- java - Weblogic 12.2.1.4-java.lang.NoSuchMethodException: com.google.common.base.internal.Finalizer.startFinalizer(java.lang.Class, java.lang.Object)
- powershell - 运行 Azure Runbook 时出错“找不到 'Test-AzPowerBIEmbeddedCapacity' 命令”
- vaadin - 在 Vaadin 14 应用程序中嵌入 video-js
- docker - 在 WSL2 中无法 curl 解决成功,但在 Docker 中可以成功