在SWIFT1.2中,声明不能同时是“最终”错误和“动态”错误

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (21)

声明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试图为Obj-C兼容性的静态属性生成一个动态访问器,因为该类继承自NSObject

如果项目仅在SWIFT中,而不是使用var访问器可以通过@nonobjcSWIFT 2.0中的

import Foundation

class AAA: NSObject {}
extension AAA {
    @nonobjc static let value = 111
}
用户回答回答于

如果类满足这些条件,将得到这个错误。

  • 子类NSObject
  • 有一个static let字段
  • 从实例方法访问字段dynamicType

我不知道为什么会这样,但你可以试试这个办法。

static var value: Int {
    get {
        return 111
    }
}

或者以更短的形式。

static var value: Int {
    return 111
}

使用static var { get }而不是static let

虽然在上面的示例中,LLVM优化器很可能会消除属性getter闭包及其调用成本,但您可能希望显式地避免它。

担心这样的值计算成本,可以创建它一次并像这样缓存。

static var value: Int {
    return cache
}
private let cache = getTheNumber()

或者像这样,如果你想把缓存完全隐藏起来。

static var value: Int {
    struct Local {
        static let cache = getTheNumber()
    }
    return Local.cache
}

扫码关注云+社区