也许这会节省一个小时或几个调试时间。在Swift中实现类似于Objective-C的XML解析器似乎很简单:
private class Customparser : NSObject,NSXMLParser
{
// ... implement the parser protocol methods
}
...
let parser=NSXMLParser(data:data)
parser.delegate=CustomParser()
let success=parser.parse()
此代码失败,实际上无用的运行时错误(访问不当)。
答案 0 :(得分:0)
原来问题是,分配给parser.delegate属性会立即直接触发自动引用计数释放,因为它是一个'assign'属性。因此,如果读者附加到不同的对象实例,它的存在时间足以实际执行其任务:
let reader=CustomParser()
let parser=NSXMLParser(data:data)
parser.delegate=reader
let success=parser.parse()
事后看来,很难说它是否是一个错误,因为它与底层的Objective-C框架的行为方式一致,但对于以Swift开始的人来说,这似乎是肯定的。
还有另一个问题:将解析器类声明为私有不会导致任何编译器错误,但它会带来运行时崩溃。取出私有修饰符可以解决问题。这是否意味着私有类的编译方式意味着它们无法传递给其他代码块?