protocol TestProtocol {
init()
}
class Person: NSObject, TestProtocol {
required override init() {
super.init()
}
}
class Man: Person {
}
class Women: Person {
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let classes: [TestProtocol.Type] = [Person.self, Man.self, Women.self]
classes.forEach { (type) in
let obj = type.init()
print(obj)
}
}
}
我尝试将Xcode10.2,Swift版本配置中的代码替换为Swift5,我希望获得Person,Man和Women的实例,但是控制台结果是:
<TestSwift5.Person: 0x6000006eb3e0>
<TestSwift5.Person: 0x6000006eb3e0>
<TestSwift5.Person: 0x6000006eb3e0>
这让我感到困惑,任何人都可以解释它。
期待您的回答,谢谢。
答案 0 :(得分:0)
从NSObject到本地Swift子类的子类中有一些关键区别。
broken https certificate missing net::ERR_UNEXPECTED
我并不是为什么会产生差异的确切专家,但这与Objective-C运行时以及NSObject获得的其他元数据有关。
在您的示例中,如果您不从NSObject继承类,您将看到控制台输出与您期望的相匹配。
我在处理表视图和集合视图单元格时遇到了这个问题。我尝试尽可能避免使用NSObject子类化,但是在不可避免的情况下,我还从Swift native base class or NSObject中定制了description
属性,以获取所需的信息。
您还可以使用CustomStringConvertible之类的技术来充分利用这一点。
protocol TestProtocol {
init()
}
class Person: TestProtocol {
required init() {
}
}
class Man: Person {
required init() {
super.init()
}
}
class Women: Person {
}
在Xcode或Playground中运行它们时,会得到以下信息:
__lldb_expr_16.Person
__lldb_expr_16.Man
__lldb_expr_16.Women