que objetos inicializadores computadas swift instantiation getter-setter computed-properties

swift - objetos - El miembro de instancia no se puede usar en el tipo



que es self en swift (7)

Tengo la siguiente clase:

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

La compilación falla con el mensaje:

El miembro de instancia ''categoriesPerPage'' no se puede usar en el tipo ''ReportView''

¿Qué significa esto?


¡Para cualquier otra persona que tropiece con esto, asegúrese de no intentar modificar la clase en lugar de la instancia! (a menos que haya declarado la variable como estática)

p.ej.

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


En caso de que alguien realmente necesite un cierre como ese, se puede hacer de la siguiente manera:

var categoriesPerPage = [[Int]]() var numPagesClosure: ()->Int { return { return self.categoriesPerPage.count } }


Está diciendo que tiene una variable de instancia (la var solo es visible / accesible cuando tiene una instancia de esa clase) y está tratando de usarla en el contexto de un ámbito estático (método de clase).

Puede convertir su variable de instancia en una variable de clase agregando un atributo estático.

Puede hacer que su método de clase sea un método de instancia eliminando el atributo de clase.


Otro ejemplo es que tienes una clase como:

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

también obtendrá el mismo tipo de error como:

instance member x cannot be used on type x.

Se debe a que asigna su método con la palabra clave "class" (que hace que su método sea un método de tipo) y usa like:

Album.getCurrentlyPlayingSongLyric(duration: 5)

¿Pero quién estableció la variable playingSong antes? Okay. No debe usar la palabra clave de clase para ese caso:

// ... func getCurrentlyPlayingSongLyric(duration: Int = 0) -> String { // ... return playingSong.lyric } // ...

Ahora eres libre de irte.


Seguí recibiendo el mismo error a pesar de hacer que la variable sea static . Solución: Limpiar compilación, limpiar datos derivados, reiniciar Xcode. O atajo Cmd + Shift + Alt + K

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


Solo tiene un error de sintaxis cuando dice = {return self.someValue} . El = no es necesario.

Utilizar :

var numPages: Int { get{ return categoriesPerPage.count } }

si quieres obtener solo puedes escribir

var numPages: Int { return categoriesPerPage.count }

con la primera forma también puedes agregar observadores como set willSet & didSet

var numPages: Int { get{ return categoriesPerPage.count } set(v){ self.categoriesPerPage = v; } }

permitiendo usar = operator como setter

myObject.numPages = 5;


Su problema inicial fue:

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

El miembro de instancia ''categoriesPerPage'' no se puede usar en el tipo ''ReportView''

las publicaciones anteriores señalan correctamente, si desea una propiedad calculada , el signo = es erróneo.

Posibilidad adicional de error:

Si su intención era "Establecer un valor de propiedad predeterminado con un cierre o función" , también necesita cambiarlo ligeramente. (Nota: este ejemplo obviamente no estaba destinado a hacer eso)

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

En lugar de eliminar el = , agregamos () para denotar un cierre de inicialización predeterminado. (Esto puede ser útil al inicializar el código de la interfaz de usuario, para mantenerlo todo en un solo lugar).

Sin embargo, se produce exactamente el mismo error :

El miembro de instancia ''categoriesPerPage'' no se puede usar en el tipo ''ReportView''

El problema está tratando de inicializar una propiedad con el valor de otra. Una solución es hacer que el inicializador sea lazy . No se ejecutará hasta que se acceda al valor.

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

¡ahora el compilador está feliz!