Apple's documentation about NSObject государства следующее как введение:
NSObject является корневым классом большинства иерархий классов Objective-C. Через NSObject объекты наследуют базовый интерфейс к системе времени выполнения и способность вести себя как объекты Objective-C.
Как это было бы предположить, вы потребность подкласса NSObject для типов введенных в коде, когда экземпляры этого типа должны вести себя как объект Objective-C (или сам класс, в некоторых редких случаях).
Я не знаю, супер явного Apple, представил письменные указания о том, когда не подкласс NSObject, за suggesting reducing dynamic dispatch или представления повторного использования кода парадигм с помощью этого делать не полагаясь на подклассы, но protocolextensions, т.е. повторное использование кода, который, как правило, более статичны отправка и value type). Я считаю, что справедливо сказать, что большинство программистов Swift получили подсказки от Apple, а функции языка Swift - в качестве признаков, позволяющих не вводить типы основанных на NSObject, когда вышеупомянутой потребности там нет. То есть, как правило, вводятся только типы основанных на NSObject, когда вам действительно нужен динамизм Objective-C, чаще всего, когда вам нужно взаимодействовать с API Cocoa (особенно часто, когда ваш код связан с UI: например, контроллеры представлений, представления) ,
As pointed out in an answer to the question you link to, с динамизмом стиля Objective-C comes the performance of objc_msgSend
based method dispatch. Хотя методы в классах Swift также являются виртуальными, компилятор может использовать более быстрые методы отправки, когда вы явно не отмечаете методы с атрибутом @objc
, особенно когда Whole Module Optimization is toggled on, а тем более в Swift 3, где classes are not by default open for subclassing beyond the module that defines the type.
Помимо исключения NSObject, вы также можете избежать ссылочных типов на основе классов in many cases при записи Swift. Взгляните, например, на видеоролики типа WWDC, связанные выше, или, например, на this blog post. Вкратце, используя типы значений, вы получаете хорошие локальные аргументы, часто избегайте распределения динамической памяти и накладных расходов на подсчет ссылок (хотя и не универсально - структурирует с ссылочными типами, поскольку поля являются оговоркой).