Декларация value
ниже
import Foundation
class AAA: NSObject {
func test2() {
self.dynamicType
}
}
extension AAA {
static let value = 111
}
вызывает следующую ошибку компиляции
A declaration cannot be both 'final' and 'dynamic'
Почему это происходит и как с этим бороться?
Я использую Swift 1.2 (версия из Xcode 6.3.1 6D1002)
swift
compiler-errors
eonil
источник
источник
func test2
Декларации не требуется , чтобы вызвать ошибку, так как из Xcode 7.3.1.Ответы:
Эта проблема возникает из-за того, что Swift пытается создать динамический аксессор для статического свойства для совместимости с Obj-C, поскольку класс наследуется от
NSObject
.Если ваш проект находится только в Swift, вместо использования средства
var
доступа вы можете избежать проблемы с помощью@nonobjc
атрибута в Swift 2.0:источник
AAA
здесь), так что я думаю, что я не уверен?NSManagedObject
подкласс. Это исправлено!Вы получите эту ошибку, если ваш класс удовлетворяет этим условиям.
NSObject
.static let
поле.dynamicType
.Я не знаю, почему это происходит, но вы можете попробовать этот обходной путь.
Или в более короткой форме.
Используйте
static var { get }
вместоstatic let
.Хотя средство получения свойства и стоимость его вызова с большой вероятностью будут исключены оптимизатором LLVM в приведенном выше примере, вы можете явно избежать этого.
Если вас беспокоит такая стоимость расчета стоимости, вы можете создать ее один раз и кэшировать вот так.
Или вот так, если вы хотите полностью скрыть существование кеша.
источник
private static let _value: Int = 111
static var value: Int { return _value }
у него нет,get {
но компилятор упоминает что-то о вычисляемом свойстве, если я используюvar
вместоlet
get
в данном случае неявно. Что вы можете сделать вместо этого правопреемником результат закрытия переменной так , что замыкание называется только один раз:let value: Int = { return 111 }()
. Скобки в конце называют закрытие. Но имейте в виду, что это снова сохраняемое свойство и поэтому не доступно в расширениях.У меня тоже была эта ошибка.
Моя проблема заключалась в статическом var в быстром расширении.
Перенос его в реализацию класса решил проблему для меня.
источник
Я только что наткнулся на ту же проблему с другой причиной и хотел бы опубликовать ее здесь для других людей, которые сталкиваются с тем же бесполезным сообщением об ошибке.
Последний класс, который переопределяет вычисляемую переменную, определенную в расширении, также вызывает эту ошибку. Однако он работает для функций и поэтому выглядит как ошибка компилятора.
источник
Я решил эту проблему, переместив статическое объявление в новую структуру, которую я определил в расширении.
Итак, вместо этого:
У меня есть это:
источник
Вы можете пометить его как частный, чтобы предотвратить эту ошибку. Если вы хотите раскрыть его, вы можете заключить его в публичную функцию:
В моем случае я ссылался на свойство только в самом расширении, поэтому не было необходимости раскрывать его.
источник
Как небольшое улучшение по сравнению с ответом @ Eonil ,
get
необязательно:источник