[swift] 유형에 인스턴스 멤버를 사용할 수 없습니다

다음 수업이 있습니다.

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