다음 수업이 있습니다.
class ReportView: NSView {
var categoriesPerPage = [[Int]]()
var numPages: Int = { return categoriesPerPage.count }
}
다음 메시지와 함께 컴파일이 실패합니다.
‘ReportView’유형에서 인스턴스 멤버 ‘categoriesPerPage’를 사용할 수 없습니다.
이것은 무엇을 의미 하는가?
답변
말할 때 구문 오류가 있습니다. = {return self.someValue}
있습니다. 은 =
필요하지 않습니다.
사용하다 :
var numPages: Int {
get{
return categoriesPerPage.count
}
}
당신이 원하는 경우에만 쓸 수 있습니다
var numPages: Int {
return categoriesPerPage.count
}
첫 번째 방법으로 관찰자를 set
willSet
&didSet
var numPages: Int {
get{
return categoriesPerPage.count
}
set(v){
self.categoriesPerPage = v
}
}
= operator
세터 로 사용 가능
myObject.numPages = 5
답변
이것을 우연히 본 사람이라면 인스턴스가 아닌 클래스를 수정하려고하지 마십시오! (변수를 정적으로 선언하지 않은 한)
예.
MyClass.variable = 'Foo' // WRONG! - Instance member 'variable' cannot be used on type 'MyClass'
instanceOfMyClass.variable = 'Foo' // Right!
답변
그것은 인스턴스 변수가 있고 (var은 해당 클래스의 인스턴스가있을 때만 보거나 액세스 할 수 있음) 정적 범위 (클래스 메소드)의 컨텍스트에서 사용하려고합니다.
정적 / 클래스 속성을 추가하여 인스턴스 변수를 클래스 변수로 만들 수 있습니다.
클래스의 인스턴스를 인스턴스화하고 해당 변수에서 인스턴스 메소드를 호출합니다.
답변
또 다른 예는 다음과 같은 클래스가 있다는 것입니다.
@obc class Album: NSObject {
let name:String
let singer:Singer
let artwork:URL
let playingSong:Song
// ...
class func getCurrentlyPlayingSongLyric(duration: Int = 0) -> String {
// ...
return playingSong.lyric
}
}
다음과 같은 유형의 오류가 발생합니다.
instance member x cannot be used on type x.
“class”키워드를 사용하여 메소드를 지정하고 (이는 메소드를 유형 메소드로 지정) like를 사용하기 때문입니다.
Album.getCurrentlyPlayingSongLyric(duration: 5)
그러나 playingSong 변수를 전에 설정 한 사람은 누구입니까? 확인. 이 경우 class 키워드를 사용해서는 안됩니다.
// ...
func getCurrentlyPlayingSongLyric(duration: Int = 0) -> String {
// ...
return playingSong.lyric
}
// ...
이제 자유롭게 갈 수 있습니다.
답변
때로는 Xcode가 메소드를 재정의 할 때 class func
그냥 대신 추가합니다 func
. 그런 다음 정적 메서드에서는 인스턴스 속성을 볼 수 없습니다. 간과하기 매우 쉽습니다. 그게 내 사건이야
답변
초기 문제는 다음과 같습니다.
class ReportView: NSView {
var categoriesPerPage = [[Int]]()
var numPages: Int = { return categoriesPerPage.count }
}
‘ReportView’유형에서 인스턴스 멤버 ‘categoriesPerPage’를 사용할 수 없습니다.
이전 게시물이 제대로 당신이 원하는 경우, 지적 계산 된 속성을 의 =
기호가 잘못된 것입니다.
오류에 대한 추가 가능성 :
“닫기 또는 함수를 사용하여 기본 속성 값 설정” 하려는 경우 약간만 변경하면됩니다. (참고 :이 예제는 분명히 그렇게하지 않았습니다)
class ReportView: NSView {
var categoriesPerPage = [[Int]]()
var numPages: Int = { return categoriesPerPage.count }()
}
대신를 제거하는 =
, 우리는 추가()
기본 초기화 클로저를 나타 내기 위해 합니다. (이는 UI 코드를 초기화 할 때 한곳에 모두 유지하기 위해 유용 할 수 있습니다.)
그러나 똑같은 오류 가 발생합니다.
‘ReportView’유형에서 인스턴스 멤버 ‘categoriesPerPage’를 사용할 수 없습니다.
문제는 한 속성을 다른 속성의 값으로 초기화하려고합니다. 한 가지 해결책은 이니셜 라이저를 만드는 것 lazy
입니다. 값에 액세스 할 때까지 실행되지 않습니다.
class ReportView: NSView {
var categoriesPerPage = [[Int]]()
lazy var numPages: Int = { return categoriesPerPage.count }()
}
이제 컴파일러는 행복합니다!
답변
변수를 만들었음에도 불구하고 같은 오류가 계속 발생했습니다 static
. 해결 방법 : 빌드 정리, 파생 데이터 정리, Xcode 다시 시작 또는 바로 가기
Cmd + Shift + Alt + K
UserNotificationCenterWrapper.delegate = self
public static var delegate: UNUserNotificationCenterDelegate? {
get {
return UNUserNotificationCenter.current().delegate
}
set {
UNUserNotificationCenter.current().delegate = newValue
}
}