2014-06-05 11 views
5

Finché una classe Swift si estende da NSObject, possiamo passarlo al runtime Objective-C e chiedergli di introspettarlo per noi.Swift: Perché il metodo di classe è stato eliminato

Abbiamo tre opzioni:

  • classe
  • classForCoder
  • classForKeyedArchiver

. . tuttavia la classe viene eliminata. (Vedi immagine). Perchè è questo?

enter image description here

risposta

7

Come si può vedere nella documentazione, è disponibile solo in Objective C e non in swift. See: https://developer.apple.com/documentation/objectivec/nsobject/1571950-class

Penso che questo sia perché l'ANYOBJECT fornisce informazioni sufficienti (Più che il NSObject) per esempio si può fare NSStringFromClass(BaseObject) in rapida invece del NSStringFromClass([BaseObject class]) che si fa in Objective C

+0

Sì, ha osservato che la classe stessa è di tipo AnyClass. È interessante notare che Birdy.classForCoder e Birdy.classForKeyedArchiver possono essere passati al runtime, ma non Birdy stesso. (Domanda successiva) –

+0

Avevi ragione. Sono riuscito a trovare una prova che la tua risposta è quella giusta. – Sulthan

8

Questo perché class è una parola chiave a Swift, quindi, qualsiasi metodo valido non può essere nominato class. Allo stesso modo non è possibile creare un metodo denominato for, while o altra parola chiave.

Non sono stato in grado di riprodurre l'eliminazione con i miei metodi, tuttavia, denominare un metodo var (o altra parola chiave) in obj-c rende impossibile la chiamata da Swift.

Modifica

mi sbagliavo. E 'ancora possibile chiamare class da Swift utilizzando

var clazz: AnyClass? = self.`class`() 

Tuttavia, il compilatore dice:

'Classe' non è disponibile: uso 'dynamicType' invece

Quindi la risposta da Edwin Vermeers è quello giusto.

+0

Utile da sapere , ma in realtà non spiega perché 'class()' appare nel menu a tendina per il completamento del codice, per non parlare di stuck-out. –

+0

sì, puoi _can_ creare metodi chiamati 'class',' for', 'while' o un'altra parola chiave usando i backtick nella tua dichiarazione:' 'func' func'() -> Void {...} '' –