странный результат init какой-то экземпляр в swift5? - PullRequest
0 голосов
/ 15 апреля 2019
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 голосов
/ 15 апреля 2019

Есть некоторые ключевые отличия в подклассах от NSObject по сравнению с нативными подклассами Swift.

Свифт базового базового класса или NSObject

Я не являюсь экспертом, в чем конкретно разница, но это связано со временем выполнения Objective C и дополнительными метаданнымивы получаете с NSObject.

В вашем примере, если вы не подкласс от NSObject, вы увидите, что вывод консоли соответствует тому, что вы ожидаете.

Я столкнулся с этой проблемой сам, когдаработа с ячейками табличного представления и представления коллекции.Я стараюсь избегать создания подклассов NSObject, когда это возможно, но когда это неизбежно, я также настраиваю свойство description из CustomStringConvertible , чтобы получить то, что мне нужно.

Вы можете также использовать такие приемы, как Отражение , чтобы извлечь из этого максимум пользы.

protocol TestProtocol {
    init()
}

class Person: TestProtocol {
    required init() {

    }
}

class Man: Person {
    required init() {
        super.init()
    }
}

class Women: Person {

}

Когда вы запускаете их в Xcode или на игровой площадке, вы получаете следующее:

__lldb_expr_16.Person
__lldb_expr_16.Man
__lldb_expr_16.Women

...