2

我正在尝试使用 Swift 创建一个 NSXMLNode 。根据类引用(和 Xcode 的自动完成),这看起来应该非常简单:

var anAttribute: NSXMLNode = NSXMLNode.attributeWithName("name", stringValue: "string")

但我收到一个错误:“调用中缺少参数 'URI' 的参数。”

然后我尝试:

var anAttribute: NSXMLNode = NSXMLNode.attributeWithName("name", URI: "uri", stringValue: "string")

这会产生同样令人着迷的错误:“调用中的额外参数'URI'。”

谁能告诉我这里发生了什么?

4

1 回答 1

4

attributeWithName()返回AnyObject?, 的 Swift 映射id。因此,您必须将返回值转换为预期的类型:

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 提交错误报告。

于 2014-08-28T03:24:25.820 回答