Ios Swift问题中的NSXMLDelegate
我试图在Swift中实现NSXMLParserDelegate,但在某些委托方法中使用属性字典时遇到问题。例如,在Ios Swift问题中的NSXMLDelegate,ios,swift,nsxmlparserdelegate,Ios,Swift,Nsxmlparserdelegate,我试图在Swift中实现NSXMLParserDelegate,但在某些委托方法中使用属性字典时遇到问题。例如,在解析器中:didStartElement:: func parser(parser: NSXMLParser!, didStartElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!, attributes attributeDict: [NSObject : AnyObje
解析器中:didStartElement:
:
func parser(parser: NSXMLParser!, didStartElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!, attributes attributeDict: [NSObject : AnyObject]!) {
正在尝试访问attributeDict值,如:
if self.feedType == FeedType.RSS {
self.insideLink = true
} else {
if (String(attributeDict["rel"]) == "alternate") && (String(attributeDict["type"]) == "text/html") {
self.link = String(attributeDict["href"])
self.insideLink = false
self.doneWithLink = true
}
}
我收到一条错误消息:“'String'不能转换为'FeedType'”
这是一个错误。这一主题的其他十几个变体也是如此。。。有什么见解吗
我想问题是如何正确使用
attributeDict
中类型为[NSObject:AnyObject]
的键/值对?看起来您可能有错误消息:我建议
我想问题是如何正确使用attributeDict
中类型为[NSObject:AnyObject]
你说得对:这似乎是问题的根源。解决方案不是从字典查找中构造字符串
,而是(有条件地)转换为字符串
。也就是说,与其尝试从不确定(可选)类型的引用创建新的字符串
,不如询问Swift该引用是否实际指向可解释为字符串的内容:
let rel = attributeDict["rel"] as? String
这将为您提供一个可选选项,这是因为attributeDict
可能不包含键rel
的值,并且条件转换可能会失败(attributeDict[“rel”]
可能是另一种类型的值)。因为您需要检查两个条件强制转换及其展开值,所以如果让
块。。。那会很快变丑的
相反,您可以利用Optional
是枚举这一事实。其定义如下:
enum Optional<T> {
case None // aka nil
case Some(T) // what you get when you unwrap a non-nil optional
}
请注意,在“收获链接”步骤中,您仍然需要有条件地强制转换和展开attributeDict[“href”]
查找。您可以通过将if let
构造嵌套在该案例
中,或者通过向开关
元组添加第三个查找来实现这一点
顺便说一句,在Swift中,所有的
self.
符号都是不必要的(除非您处于闭包中或需要从实例属性中消除方法参数的歧义)。看起来您可能有一个虚假的错误消息:我建议您这样做
我想问题是如何正确使用attributeDict
中类型为[NSObject:AnyObject]
你说得对:这似乎是问题的根源。解决方案不是从字典查找中构造字符串
,而是(有条件地)转换为字符串
。也就是说,与其尝试从不确定(可选)类型的引用创建新的字符串
,不如询问Swift该引用是否实际指向可解释为字符串的内容:
let rel = attributeDict["rel"] as? String
这将为您提供一个可选选项,这是因为attributeDict
可能不包含键rel
的值,并且条件转换可能会失败(attributeDict[“rel”]
可能是另一种类型的值)。因为您需要检查两个条件强制转换及其展开值,所以如果让
块。。。那会很快变丑的
相反,您可以利用Optional
是枚举这一事实。其定义如下:
enum Optional<T> {
case None // aka nil
case Some(T) // what you get when you unwrap a non-nil optional
}
请注意,在“收获链接”步骤中,您仍然需要有条件地强制转换和展开attributeDict[“href”]
查找。您可以通过将if let
构造嵌套在该案例
中,或者通过向开关
元组添加第三个查找来实现这一点
顺便说一句,Swift中不需要所有的
self.
符号(除非您处于闭包中或需要从实例属性中消除方法参数的歧义)。您可以发布错误吗?错误:'String'不能转换为'FeedType'。在哪一行报告该错误?该行上使用的值的声明是什么?第二个if语句中报告了错误:if(String(attributeDict[“rel”])==“alternate”)…您可以发布错误吗?错误:'String'不能转换为'FeedType'。在哪一行报告了错误?该行上使用的值的声明是什么?第二个if语句中报告了错误:if(字符串(attributeDict[“rel”])==“alternate”)…请注意,虽然同时展开多个选项的开关
模式仍然有效(在某些情况下仍然特别有用),它不再是一次打开多个选项的唯一方法-在一个if let
语句中可以放置多个绑定。请注意,虽然一次打开多个选项的开关
模式仍然有效(对于某些情况仍然特别有用),它不再是一次打开多个选项的唯一方法-在一个if let
语句中可以放置多个绑定。