我正在尝试使用 Swift 创建一个 NSXMLNode。根据 the class reference,这似乎应该非常简单(以及 Xcode 的自动补全):
var anAttribute: NSXMLNode = NSXMLNode.attributeWithName("name", stringValue: "string")
但我收到错误消息:“调用中缺少参数‘URI’的参数。”
然后我尝试:
var anAttribute: NSXMLNode = NSXMLNode.attributeWithName("name", URI: "uri", stringValue: "string")
这会产生同样令人迷惑的错误:“调用中的额外参数‘URI’。”
谁能告诉我这是怎么回事?
请您参考如下方法:
attributeWithName() 返回 AnyObject?,id 的 Swift 映射。因此你 必须将返回值转换为预期类型:
let anAttribute = NSXMLNode.attributeWithName("name", stringValue: "string") as NSXMLNode
或者,如果您想检查可能的故障:
if let anAttribute = NSXMLNode.attributeWithName("name", stringValue: "string") as? NSXMLNode {
// success
} else {
// failed
}
根本原因是Objective-C函数
+ (id)attributeWithName:(NSString *)name stringValue:(NSString *)value
返回 id。如果它被声明为
+ (instancetype)attributeWithName:(NSString *)name stringValue:(NSString *)value
(这是声明类/工厂方法的“现代”方式)那么这将是 映射到 Swift 为
class func attributeWithName(_ name: String!,
stringValue value: String!) -> NSXMLNode!
使显式转换变得不必要。 您可以就此向 Apple 提交错误报告。
