A declaration cannot be both 'final' and 'dynamic' error in Swift 1.2
You will get this error if your class satisfies these conditions.
- Subclassed from
NSObject
. - Has a
static let
field. - Accesses the field from an instance method via
dynamicType
.
I don't know why this happens, but you can try this workaround.
static var value: Int {
get {
return 111
}
}
Or in shorter form.
static var value: Int {
return 111
}
Use static var { get }
instead of static let
.
Though property getter and its calling cost is very likely to be eliminated by LLVM optimiser in above example, you might want to avoid it explicitly.
If you're concerned about such value calculation cost, you can create it once and cache like this.
static var value: Int {
return cache
}
private let cache = getTheNumber()
Or like this if you want to hide the existence of cache completely.
static var value: Int {
struct Local {
static let cache = getTheNumber()
}
return Local.cache
}
This issue arises because Swift is trying to generate a dynamic accessor for the static property for Obj-C compatibility, since the class inherits from NSObject
.
If your project is in Swift only, rather than using a var
accessor you can avoid the issue via the @nonobjc
attribute in Swift 2.0:
import Foundation
class AAA: NSObject {}
extension AAA {
@nonobjc static let value = 111
}
I had this error too.
My issue was just a static var in a swift extension.
extension NotificationsViewController: UITableViewDataSource , UITableViewDelegate {
static var timeIntervalFormatter = NSDateComponentsFormatter()
}
Moving it to the class implementation resolved the problem for me.