在swift5中初始化某个实例的奇怪结果?

时间:2019-04-15 13:55:30

标签: protocols nsobject swift5 xcode10.2

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>

这让我感到困惑,任何人都可以解释它。

期待您的回答,谢谢。

1 个答案:

答案 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