선언은 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에만 있다면,var
accessor 를 통해 문제를 피할 수 있습니다.@nonobjc
Swift 2.0의 속성:
import Foundation
class AAA: NSObject {}
extension AAA {
@nonobjc static let value = 111
}
만약 당신의 수업이 이 조건을 만족한다면 당신은 이 오류를 얻게 될 것입니다.
- 하위 분류:
NSObject
. - Has a
static 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
'programing' 카테고리의 다른 글
우커머스를 카트 URL에 추가 (0) | 2023.11.02 |
---|---|
mariadb의 "With As"를 변경하는 다른 방법 (0) | 2023.11.02 |
linux/list.h의 macro의 container_뒤에 있는 이론적 근거 (0) | 2023.11.02 |
__sync_sync_sync_sync는 어떤 역할을 합니까? (0) | 2023.11.02 |
XML 구문 분석 - 요소트리 대 SAX 및 DOM (0) | 2023.11.02 |