在Swift 1.2中,聲明不能既是'最終'也是'動態'錯誤



Answers

如果你的課程滿足這些條件,你會得到這個錯誤。

  • NSObject
  • 有一個static let場。
  • 通過dynamicType從實例方法訪問字段。

我不知道為什麼會發生這種情況,但您可以嘗試此解決方法。

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

或者以較短的形式。

static var value: Int {
    return 111
}

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

雖然在上面的例子中,屬性獲取器關閉和調用成本很可能被LLVM優化器消除,但您可能想要明確避免它。

如果您擔心這種價值計算成本,您可以創建一次並像這樣緩存。

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

或者像這樣,如果你想完全隱藏它的緩存。

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

下面的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內的版本)




我只是偶然發現了一個與其他原因相同的問題,並希望將它發布給其他遇到相同無用錯誤消息的人。

覆蓋擴展中定義的計算變量的最終類也會導致此錯誤。 它適用於函數,因此看起來像一個編譯器錯誤。

// at line 0: a declaration cannot be both 'final' and 'dynamic'

import UIKit

extension UIViewController {
    var test: Int { return 0 }
}

final class TestController: UIViewController {
    override var test: Int { return 1 }
}



您可以將其標記為私密以防止出現此錯誤。 如果你想公開它,你可以把它包裝在一個公共函數中:

extension AAA {

    private static let value = 111

    public func getDatValue() -> Int {
        return AAA.value
    }    
}

就我而言,我只是在擴展本身中引用屬性,所以不需要公開它。




Links