Давайте напишем простой класс, чтобы объяснить в моей голове:
class SomeClass {
var happyToUsed = 10
}
И создать объект
let someObject = SomeClass()
и используйте его свойство для случая 1:
someObject.happyToUsed // prints 10
для случая 2:
someObject.self.happyToUsed // prints 10
и случай 3
someObject.self.self.self.self.happyToUsed // prints 10 compiler is still ok, even if self count 1k
Я знаю, что случай 1 и случай 2 одинаковы (непосредственно указывают на один и тот же объект). Даже если я использовал SomeClass.self, а не объекты, случаи будут действовать одинаково. До сих пор я когда-либо использовал случай 3 в проекте.
Мой вопрос: есть ли какой-нибудь пример случая 3, который я должен предпочесть или негативно повлиять на управление памятью?
@JoakimDanielson спасибо, я когда-либо использовал до случая 3, но мне просто интересно, в случае 3 есть смысл или нет.
Это Самовыражение Postfix в соответствии со ссылкой на Swift:
Постфиксное самовыражение состоит из выражения или имени типа, за которым сразу следует
.self
Первая форма вычисляет значение выражения. Например, x.self оценивается как x.
Тот факт, что вы можете писать .self
бесконечно, является лишь побочным эффектом этого определения. Поскольку x.self
само по себе является выражением, вы также можете добавить к нему .self
. И ты можешь делать это вечно.
Это не значит, что вы должны, хотя.
Они делают то же самое:
let x = 10
let x = 10
Надеюсь, вы согласитесь, что второе читается лучше. Точно так же .self
обычно избыточен. Согласно этому обсуждению, кажется, что .self
на самом деле просто наследие Objective-C. ИМО, это также делает синтаксис, такой как путь ключа идентификации (\.self
), «имеет больше смысла».
Между ними нет различий, в конечном итоге вы указываете на один и тот же экземпляр; Классы являются ссылочными типами, поэтому, что бы ни случилось, они всегда будут указывать на одну и ту же ссылку; Вам не нужно повторять его, так как он занимает то же место в памяти, которое уже зарезервировано.
Спасибо, но я не спрашивал, какой тип ссылки.
Я знаю, я просто добавил это как дополнительное объяснение
На самом деле я не вижу смысла в этом вопросе, но, поскольку рекомендуется не использовать
self
, если это действительно не нужно, поэтому для вашего кода только случай 1 является правильным использованиемself