разница между NSObject и Struct

#struct #swift #ios8

#структура #swift #ios8

Вопрос:

Я хочу знать разницу между NSObject и struct ..Следующий пример объяснит оба случая

В struct

 struct UserDetails{
    var userName:String
    var userID:String
    var userAge:String
    func userDescription()->String{
        return "name "   userName   "age "   userAge
    }
}
 

В NSObject классе

 class UserDetails: NSObject {
    var userName:String?
    var userID:String?
    var userAge:String?
    func userDescription()->String{
        return "name "   userName!   "age "   userAge!
    }
}
 

Может кто-нибудь, пожалуйста, скажите мне, где я должен использовать NSObject class, где я должен использовать struct ..?

Ответ №1:

1) Структуры передаются по значению, экземпляры классов по ссылке 2) Классы могут быть подклассами, структуры — нет.

Является ли класс подклассом NSObject или нет, (в основном) не имеет значения. Вы с таким же успехом могли бы сказать:

 class UserDetails {
    var userName:String?
    var userID:String?
    var userAge:String?
    func userDescription()->String{
        return "name "   userName!   "age "   userAge!
    }
}
 

Комментарии:

1. Я не уверен, что в этом много чего есть — это действительно дизайнерское решение. Если вам когда-нибудь понадобится подкласс, Class — это правильный путь. Если вы знаете, что никогда не будете создавать подклассы, вы можете использовать структуру.

2. Ни то, ни другое. Оба имеют хорошие и плохие аспекты производительности, в зависимости от ситуации (классы требуют подсчета ссылок, косвенного указания указателей и выделения памяти, но структуры требуют создания копий).

3. @Grimxn другими словами, если вы будете передавать множество структур повсюду, они будут намного медленнее, чем объекты, и использовать значительно больше оперативной памяти. Если вы не будете часто передавать их по кругу, то структуры будут работать быстрее и потреблять меньше оперативной памяти. В принципе, если ваш код слишком медленный или использует слишком много памяти, вам следует рассмотреть возможность тестирования другого.

4. @newacct Меня смущает ваше использование «вы можете манипулировать ими только с помощью указателей», поскольку (несмотря на базовое представление) одной из основных тем Swift является удаление концепции указателей из семантики разработчиков при использовании языка.

5. @Grimxn: они являются указателями, независимо от того, как вы их называете. Указатель = что-то, что указывает на что-то. «Ссылочный тип» означает тип, значениями которого являются ссылки (указатели).

Ответ №2:

Классы и структуры в Swift намного ближе, чем во многих языках. Оба могут иметь свойства, метод, инициализаторы, индексы, могут соответствовать протоколам и могут быть расширены. Однако только классы могут использовать преимущества наследования и использовать деинициализаторы, а поскольку классы используются по ссылке, у вас может быть более одной ссылки на конкретный экземпляр.

Структуры используются во всем Swift — массивы, словари, все необязательное и многое другое построено на struct типе, поэтому производительность должна быть очень высокой. Вы можете использовать struct его всякий раз, когда вам не нужно наследование или множественные ссылки, предоставляемые классами.

Комментарии:

1. какой из них займет больше памяти?

2. Optional на самом деле это an enum , но они похожи на struct s