Когда использовать статическую константу и переменную в Swift?

Есть несколько постов о том, как написать код дляstatic constant а такжеstatic variable в Свифте. Но не понятно когда использоватьstatic constant а такжеstatic variable скорее, чемconstant а такжеvariable, Может кто-нибудь объяснить?

Ответы на вопрос(4)

Решение Вопроса

Это более важный комментарий:

class Person {
    static var name = "Static John" // a property of Person 'type'
    var name = "Alex" // a property of Person 'instance'

    var nonStaticName = "Peter"
    static var staticName = "Sara"



    static func statFunc() {
        let x = Person.name // Static John
        let y = name // Static John or Alex?!  Static John!!!!
        let r = staticName // Sara
        let k = nonStaticName // ERROR: instance member 'nonStaticName' cannot be used on type 'Person'
        // The compiler is like: I'm referrting to the `nonStaticName` property of which instance?! There is no instance! Sorry can't do!

    }

    func nonStaticFunc() {
        let x = Person.name // Static John
        let y = name // Static John or Alex?! Alex!!! Because we're in a instance scope...
        let k = nonStaticName // Obviously works
        let r = staticName // ERROR: static member 'staticName' cannot be used on instance of type 'Person'. Person.staticName will work
    }
}

Интересные наблюдения:

Первый:

static var name = "Static John" // a property of Person 'type'
var name = "Alex" // a property of Person 'instance'

не создает конфликтов.

Во-вторых:

Вы никогда не можете использовать переменные экземпляра внутри статических переменных. Вы можете использовать статические переменные внутрифункции экземпляра если вы ссылаетесь на него, ставя перед ним префикс типа т.е.Person.name, в то время как

статические переменные могут быть доступнывнутри статика функции с или без префикса типа, т.е.Person.staticName или жеstaticName обе работают.

Есть несколько постов о том, как написать код для статической константы и статической переменной в Swift. Но не ясно, когда использовать статическую константу и статическую переменную, а не постоянную и переменную. Может кто-нибудь объяснить? Когда вы определяете статический var / let для класса (или структуры), это значение будет общим для всех экземпляров (или значений).

статические переменные / класс - это переменные, к которым можно обращаться без необходимости создания какого-либо экземпляра / объекта.

class Human {
    static let numberOfEyes = 2 //human have only 2 eyes
    static var eyeDefect = false //whether human have side-effect or not. he can have defect later so its variable

    //other variables and functions
}

//you can access numberOfEyes like below no object of Human is created
print(Human.numberOfEyes)
print(Human.eyeDefect)

//Object of Human
let john = Human()

Я думаю, что вы знаете разницу между константой и переменной. Короче говоря, константа - это то, чье значение никогда не меняется; numberOfEyes в приведенном выше примере и переменная - это то, чье значение изменяется; eyeDefect в приведенном выше примере.

статическая константа или переменные помещаются в память (RAM) отдельно от объектов. то есть, у numberOfEyes выделено другое пространство памяти, чем у объекта John, его нет внутри John.

Теперь, когда использовать статические константы / переменные:

Когда вы используете шаблон проектирования синглтона: static let sharedInstance = APIManager ()

class APIManager(){
    static let sharedInstance = APIManager()
    //Your other variables/functions here below
}
//Use it as to get singleton instance of APIManager from anywhere in your application
let instanceOfAPIManager = APIManager.sharedInstance

Когда вам нужно значение чего-либо, что является глобально одинаковым, без необходимости создавать экземпляр класса, под которым он определен, как numberOfEyes в человеческом классе.

Использование статических переменных / констант не очень рекомендуется из-за проблем с памятью, потому что как только он создан / назначен, он остается в памяти, пока ваше приложение не будет удалено из памяти. До сих пор я обнаружил, что лучшее место для использования статических переменных / констант - только при создании одноэлементного шаблона, а иногда указатели на другие нормальные переменные и константы не используют статические, потому что: из-за проблемы с памятью будет сложно запустить модульное тестирование в вашем коде со статическими переменными / константами. Не рекомендуется использовать так же, как в классе людей. вместо этого используйте их как просто константу или переменные и обращайтесь к ним, создавая экземпляр.

class Human {
 let numberOfEyes = 2 //human have only 2 eyes
 var eyeDefect = false //whether human have side-effect or not. he can have defect later so its variable

   //other variables and functions
 }

//you can access numberOfEyes like below if you need just those values.
print(Human().numberOfEyes)
print(Human().eyeDefect)

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

Поэтому, когда у вас есть классMyClass со статической переменнойxВы также можете получить к нему доступ черезMyClass.x непосредственно.x будет использоваться всеми экземплярами класса

 Mike08 июн. 2016 г., 14:07
Спасибо, у меня есть идея Хорошего дня!
Решение Вопроса

Когда вы определяете статический var / let в классе (или структуре), эта информация будет разделена между всеми экземплярами (или значениями).

Обмен информацией
class Animal {
    static var nums = 0

    init() {
        Animal.nums += 1
    }
}

let dog = Animal()
Animal.nums // 1
let cat = Animal()
Animal.nums // 2

Как вы можете видеть здесь, я создал 2 отдельных экземпляраAnimal но оба имеют одну и ту же статическую переменнуюnums.

одиночка

Часто статическая константа используется для принятия шаблона Singleton. В этом случае мы хотим, чтобы было выделено не более 1 экземпляра класса. Для этого мы сохраняем ссылку на общий экземпляр внутри константы и скрываем инициализатор.

class Singleton {
    static let sharedInstance = Singleton()

    private init() { }

    func doSomething() { }
}

Теперь, когда нам нужноSingleton экземпляр мы пишем

Singleton.sharedInstance.doSomething()
Singleton.sharedInstance.doSomething()
Singleton.sharedInstance.doSomething()

Такой подход позволяет нам всегда использовать один и тот же экземпляр, даже в разных точках приложения.

 Mike08 июн. 2016 г., 14:10
Благодарю. Теперь я абсолютно понимаю, как использовать статические.
 Mike08 июн. 2016 г., 14:04
Спасибо. Это объясняется очень четко. Можете ли вы подтвердить правильность моего понимания: 1. Как упоминается в некоторых документах, статическая переменная и константа являются здесь типом, а не экземпляром; 2. Его можно использовать так же, как свойство класса.
 Vincent Joy06 дек. 2017 г., 07:13
Спасибо большое. Это было так запутанно для меня очень долгое время. Но теперь все ясно.
 imaginae22 авг. 2019 г., 09:26
Большое спасибо. Помимо статических свойств, я теперь также понимаю, что такое синглтон.
 Saif27 апр. 2017 г., 09:44
1.Статические переменные в классе находятся на уровне класса, а не на уровне объекта (нам не нужно инициализировать класс для доступа к переменной).2, Статические переменные имеют одинаковые ссылки на разные экземпляры класса3, Статические переменные не видны подклассам.
 Luca Angeletti08 июн. 2016 г., 14:06
@Mike: 1) Статическая переменная / пусть может ссылаться на экземпляр класса (как в моемSingleton пример) или может хранить значение (как вAnimal пример). Так же, как обычный var / let. 2) Да, мы можем увидетьstatic var/let как свойство, которое принадлежит самому классу, а не экземпляру.

Ваш ответ на вопрос