programing

선언은 Swift 1.2의 '최종' 오류와 '동적' 오류 모두일 수 없습니다.

muds 2023. 11. 2. 22:09
반응형

선언은 Swift 1.2의 '최종' 오류와 '동적' 오류 모두일 수 없습니다.

의 선언.value아래

import Foundation

class AAA: NSObject {
    func test2() {
        self.dynamicType
    }
}
extension AAA {
    static let value    =   111
}

다음 컴파일 오류가 발생합니다.

A declaration cannot be both 'final' and 'dynamic'

왜 이런 일이 발생하고, 어떻게 대처해야 합니까?

저는 스위프트 1.2 (Xcode 6.3.16 D1002 내에 출고된 버전)를 사용하고 있습니다.

이 문제는 클래스가 다음에서 상속되므로 Swift가 Obj-C 호환성에 대한 정적 속성에 대한 동적 액세스자를 생성하려고 하기 때문에 발생합니다.NSObject.

만약 당신의 프로젝트가 a를 사용하는 것이 아니라 swift에만 있다면,varaccessor 를 통해 문제를 피할 수 있습니다.@nonobjcSwift 2.0의 속성:

import Foundation

class AAA: NSObject {}
extension AAA {
    @nonobjc static let value = 111
}

만약 당신의 수업이 이 조건을 만족한다면 당신은 이 오류를 얻게 될 것입니다.

  • 하위 분류:NSObject.
  • Has astatic let들판.
  • 인스턴스 메서드에서 필드에 액세스합니다.dynamicType.

왜 이런 일이 생기는지는 모르겠지만, 이 방법을 사용해 보세요.

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

아니면 더 짧은 형태로.

static var value: Int {
    return 111
}

사용하다static var { get }대신에static let.


속성 게터와 그 호출 비용은 위의 예에서 LLVM optimizer에 의해 제거될 가능성이 매우 높으나, 이를 명시적으로 피하는 것이 좋을 것입니다.

그런 가치 계산 비용이 걱정된다면 한 번만 생성해서 이렇게 캐시하면 됩니다.

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

캐시의 존재를 완전히 숨기려면 이렇게 해야 합니다.

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

저도 이런 오류가 있었습니다.

제 문제는 신속한 확장에서 정적인 변화에 불과했습니다.

extension NotificationsViewController: UITableViewDataSource , UITableViewDelegate {

    static var timeIntervalFormatter = NSDateComponentsFormatter()

}

수업 실행으로 옮겨서 문제가 해결되었습니다.

저는 다른 원인으로 같은 문제를 우연히 발견했고, 같은 불필요한 오류 메시지를 경험하는 다른 사람들을 위해 여기에 게시하고 있습니다.

확장에 정의된 계산 변수를 재정의하는 최종 클래스도 이 오류를 발생시킵니다.이것은 기능을 위해 작동하기 때문에 컴파일러 버그처럼 보입니다.

// 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 }
}

저는 이 문제를 제가 확장자에서 정의한 새로운 구조로 static declaration을 이동하여 해결하였습니다.

그래서 이것 대신에:

extension NSOperationQueue {
    static var parsingQueue : NSOperationQueue = {
        let queue = NSOperationQueue()
        queue.maxConcurrentOperationCount = 1
        return queue
        }()
}

나는 이것을 가지고 있습니다.

extension NSOperationQueue {        
    struct Shared {
        static var parsingQueue : NSOperationQueue = {
            let queue = NSOperationQueue()
            queue.maxConcurrentOperationCount = 1
            return queue                
            }()
    }
}

이 오류를 방지하기 위해 비공개로 표시할 수 있습니다.노출하려는 경우 공용 기능으로 감쌀 수 있습니다.

extension AAA {

    private static let value = 111

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

저 같은 경우는 확장 자체에 있는 재산만 참고했기 때문에 굳이 노출시킬 필요가 없었습니다.

@Eonil의 답변에 비해 약간의 개선으로,get필요 없음:

static var value: Int { return  111 }

언급URL : https://stackoverflow.com/questions/29814706/a-declaration-cannot-be-both-final-and-dynamic-error-in-swift-1-2

반응형