#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
на самом деле это anenum
, но они похожи наstruct
s