У меня есть эти определения в моей функции, которые работают
class MyClass {
func myFunc() {
let testStr = "test"
let testStrLen = countElements(testStr)
}
}
Но если я переведу testStr и testStrLen на уровень класса, он не будет компилироваться. Он сказал, что MyClass.Type не имеет члена с именем testStr.
class MyClass {
let testStr = "test"
let testStrLen = countElements(testStr)
func myFunc() {
}
}
Как я могу это исправить? Я не хочу платить штраф за то, что каждый раз подсчитывает len постоянной «проверки».
Исходя из моих представлений о комментариях ниже, мне нужно сделать следующее:
class MyClass {
let testStr = "test"
let testStrLen = countElements("test")
func myFunc() {
}
}
Есть ли способ, которым мне не нужно вводить «тест» дважды? Спасибо.
Ответы:
Возможно, хорошая идиома для объявления констант для класса в Swift - просто использовать структуру с именем MyClassConstants, как показано ниже.
Таким образом, ваши константы будут ограничены объявленной конструкцией, а не перемещаться по всему миру.
Обновить
Я добавил константу статического массива в ответ на комментарий, спрашивающий об инициализации статического массива. См. Литералы массивов в разделе «Язык программирования Swift».
Обратите внимание, что для инициализации массива можно использовать как строковые литералы, так и строковую константу. Однако, поскольку тип массива известен, целочисленную константу
testStrLength
нельзя использовать в инициализаторе массива.источник
static
констант вStruct
и вClass
es?MyClassConstants.testStr.rawValue
для доступа к значению, что не так синтаксически дружественно, как простоMyClassConstants.testStr
.Добавление к ответу @Martin ...
Если кто-то планирует сохранить файл констант на уровне приложения, вы можете сгруппировать константы по их типу или характеру.
Вызов :
Constants.MixpanelConstants.activeScreen
ОБНОВЛЕНИЕ 5/5/2019 (вроде не по теме, но)
После прочтения некоторых рекомендаций по коду и из личного опыта кажется, что структуры - не лучший подход для хранения глобальных констант по нескольким причинам. В частности, приведенный выше код не препятствует инициализации структуры. Мы можем добиться этого, добавив шаблонный код, но есть лучший подход.
ENUMS
То же самое может быть достигнуто с помощью перечисления с более безопасным и понятным представлением.
источник
Если я правильно понимаю ваш вопрос, вы спрашиваете, как вы можете создавать константы уровня класса (статические - на языке C ++), чтобы вы не: а) реплицировали накладные расходы в каждом случае, и b приходилось пересчитывать то, что в противном случае является постоянным.
Язык эволюционировал - как известно каждому читателю, но пока я тестирую это в Xcode 6.3.1, решение следующее:
Я не знаю, является ли статика строго необходимой, поскольку компилятор наверняка добавляет только одну запись для каждой константной переменной в статический раздел двоичного файла, но это влияет на синтаксис и доступ. Используя статические, вы можете обратиться к нему , даже если у вас нет экземпляра:
MyClass.testStrLen
.источник
Если вам действительно нужно статическое свойство вашего класса, оно в настоящее время не поддерживается в Swift. Текущий совет состоит в том, чтобы обойти это, используя глобальные константы:
Если вы хотите, чтобы это были свойства экземпляра, вы можете использовать ленивое сохраненное свойство для длины - оно будет оцениваться только при первом обращении, поэтому вы не будете вычислять его снова и снова.
источник
А как насчет использования вычисленных свойств?
источник
Некоторые могут захотеть, чтобы определенные константы класса были общедоступными, а другие - частными.
Ключевое слово private можно использовать для ограничения объема констант в одном и том же файле swift.
Другие классы смогут получить доступ к константам вашего класса, как показано ниже
источник
Пробовал на игровой площадке
источник