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


138

다음 수업이 있습니다.

class ReportView: NSView {  
    var categoriesPerPage = [[Int]]()
    var numPages: Int = { return categoriesPerPage.count }
}

다음 메시지와 함께 컴파일이 실패합니다.

'ReportView'유형에서 인스턴스 멤버 'categoriesPerPage'를 사용할 수 없습니다.

이것은 무엇을 의미 하는가?


12
numPages클로저가 아닌 계산 된 속성을 선언 할 것으로 예상 되면 등호를 삭제하십시오.var numPages: Int { return categoriesPerPage.count }
vadian

1
이 오류 메시지의 의미를보다 정확하게 설명 할 수 있습니까? 나는 완전히 다른 상황에서 그것을보고 있습니다.
윌리엄 Entriken

2
위와 같이 클래스 범위에서 블록을 선언하면 유형에서 사용 가능한 것으로 제한됩니다. 인스턴스 멤버에 액세스 할 수 없습니다.
Aderstedt

참고 : 오류 메시지는 지연 변수만들 려고 할 때 나타나는 것과 비슷 하지만 요구 사항 중 하나를 잊었습니다 . 귀하의 경우에는 대신로 categoriesPerPage정의 된 lazy 변수를 원하지 않습니다 . varlet
Senseful

1
제거 =에서 : var numPages : Int =
andrewz

답변:


132

말할 때 구문 오류가 있습니다. = {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

1
죄송합니다. 등호를 놓쳤습니다. 감사.
Aderstedt

당신은 당신이 초기화거야 말을하고 categoriesPerPage있는가에 2 희미한 배열, v지능이다?
Dan

@Dan Your'e 오른쪽의 예는 단지 설명하는 것입니다 set물론 - 당신이 할당 할 수 없습니다, 예를 int[int]
다니엘 KROM

이 백만 번을 완료하고 여전히 추가 = 부호를 놓쳤다 :)
Alexandre G

당신은 세미콜론 가족이 필요하지 않습니다
Peter Schorn

51

이것을 우연히 본 사람이라면 인스턴스가 아닌 클래스를 수정하려고하지 마십시오! (변수를 정적으로 선언하지 않은 한)

예.

MyClass.variable = 'Foo' // WRONG! - Instance member 'variable' cannot be used on type 'MyClass'

instanceOfMyClass.variable = 'Foo' // Right!

5
static변수와 instance변수 의 차이점입니다. MyClass.variable정적 변수 (모든 인스턴스간에 공유)로 선언하면 유효합니다
Daniel Krom

이것은 내 문제였다. XCode가 클래스 자체가 아닌 인스턴스를 확실히 사용하는 것처럼 컨텍스트가 비슷한 이름의 인스턴스보다 자동 완성 옵션에서 클래스를 먼저 선택하기로 결정한 경우 이상한 것으로 나타났습니다. 인스턴스가 사례마다 다를 경우 인스턴스를 선택하지 않고 클래스를 선택한 것을 알기가 어려울 수 있습니다. 감사!
LeftOnTheMoon

19

그것은 인스턴스 변수가 있고 (var은 해당 클래스의 인스턴스가있을 때만 보거나 액세스 할 수 있음) 정적 범위 (클래스 메소드)의 컨텍스트에서 사용하려고합니다.

정적 / 클래스 속성을 추가하여 인스턴스 변수를 클래스 변수로 만들 수 있습니다.

클래스의 인스턴스를 인스턴스화하고 해당 변수에서 인스턴스 메소드를 호출합니다.


필자의 경우 다른 클래스의 인스턴스가 초기화 된 후 호출 된 완료 블록에서 인스턴스 변수를 사용하려고했습니다. 물론 init는 클래스 함수이며 인스턴스 변수를 정적으로 선언하면 문제가 해결됩니다.
Reinhard Männer

8

또 다른 예는 다음과 같은 클래스가 있다는 것입니다.

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

 // ...

이제 자유롭게 갈 수 있습니다.


8

때로는 Xcode가 메소드를 재정의 할 때 class func그냥 대신 추가합니다 func. 그런 다음 정적 메서드에서는 인스턴스 속성을 볼 수 없습니다. 간과하기 매우 쉽습니다. 그게 내 사건이야

여기에 이미지 설명을 입력하십시오


아 감사합니다! Xcode에서 인스턴스 멤버 자동 완성 제안을 얻지 못한 이유를 알아내는 데 오랜 시간을 보냈습니다. 이것은 버그처럼 보인다, 나는 애플에 레이더를 제출할 것이다 👍🏽
Apoorv Khatreja

3

초기 문제는 다음과 같습니다.

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

이제 컴파일러는 행복합니다!


0

변수를 만들었음에도 불구하고 같은 오류가 계속 발생했습니다 static. 해결 방법 : 빌드 정리, 파생 데이터 정리, Xcode 다시 시작 또는 바로 가기 Cmd + Shift + Alt + K

UserNotificationCenterWrapper.delegate = self

public static var delegate: UNUserNotificationCenterDelegate? {
        get {
            return UNUserNotificationCenter.current().delegate
        }
        set {
            UNUserNotificationCenter.current().delegate = newValue
        }
    }

0

누군가가 실제로 그러한 폐쇄 가 필요한 경우를 대비 하여 다음과 같은 방법으로 수행 할 수 있습니다.

var categoriesPerPage = [[Int]]()
var numPagesClosure: ()->Int {
    return {
        return self.categoriesPerPage.count
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.