Swift: Come inizializzare istanza di una classe all’interno di una classe

Sono sconcertato da errori derivanti durante il tentativo di inizializzare un’istanza di un array in una classe. Le osservazioni che seguono sono gli errori xcode 6 mostra.

Ho creato una classe. Si tratta di avere istanza di NSMutableArray. Voglio inizializzare l’array (e quindi la chiamata di sé.instancename.init()). Si lamenta se non ce l’ho. Si lamenta se lo faccio.

importazione Fondazione

class testclass:NSObject {

    var list_of_things:NSMutableArray;

    init (){  //Designated initializer for 'testclass' cannot delegate (swith self.init);
              //did you means this to be a convenience initializer?
        self.list_of_things.init();
              //'init' can only refer to the initializers of 'self' or 'super'
        super.init()
              //Initializer cannot both delegate ('self.init') and chain to a superclass
              //initializer ('super.init')
    }
}



4 Replies
  1. 4

    È necessario assegnare un valore alla variabile, non c’è nulla in quella variabile chiamata init su:

    init () {
        self.list_of_things = NSMutableArray()
        super.init()
    }

    Anche un paio di note:

    1. Non hai bisogno di punti e virgola alla fine delle righe (so che l’abitudine è difficile da rompere)
    2. Non è necessario ereditare da NSObject
    3. Si dovrebbe preferire l’uso di nativi swift array (Array) invece di NSMutableArray
    4. Classi deve sempre iniziare con la lettera maiuscola
    5. I nomi delle variabili devono utilizzare cammello caso invece sottolinea

    Questo sarebbe il mio pulito versione di prova di classe:

    class TestClass {
        var listOfThings: [AnyObject]
    
        init () {
            self.listOfThings = []
            super.init()
        }
    }

    E in realtà, se si desidera inizializzare un array vuoto, non c’è nemmeno bisogno di implementare init o specificare il tipo in modo esplicito:

    class TestClass {
        var listOfThings = []
    }
    • Grazie. La risposta alla mia domanda e una serie di altre domande che erano nella mia testa. Sono d’accordo che il punto e virgola è solo un’abitudine, prelevato dal C e systemVerilog. Dovrei cambiare il mio cervello a Python modalità di cui io non uso il punto e virgola.
    • Tranne questo: “i nomi delle Variabili devono utilizzare cammello caso invece dei trattini” – ho usato il carattere di sottolineatura in C e in C++, e quindi in Obj-C (a meno che non initWithXXX a causa di objc runtime). E terrò uso che in SWIFT.
    • vi sono, naturalmente, il diritto di utilizzare i caratteri di sottolineatura, se si preferisce, ma si avrà un tempo più difficile collaborando con la maggior parte di altri sviluppatori, perché la stragrande maggioranza utilizza cammello caso. Non a seguito di convenzioni è una barriera alla comunicazione con gli altri.
  2. 2

    Per chiamare l’inizializzatore di un’altra classe, si chiama semplicemente così:

    self.list_of_things = NSMutableArray()

    Non c’è bisogno di implicitamente chiamare il init() funzione, è implicita quando si aggiunge l’ () per il nome della classe.

    Si può anche inizializzare quando si crea la vostra proprietà, come questo:

    var list_of_things:NSMutableArray = NSMutableArray()
  3. 0

    Non è così che si chiama init su NSMutableArray.

    class testclass:NSObject {
    
        var list_of_things:NSMutableArray
    
        init (){ 
            self.list_of_things = NSMutableArray()
            super.init()
        }
    }

    E di sbarazzarsi di quei punti e virgola! Che cosa è questo? la settimana scorsa?

  4. 0

    Fine alla fine risposta. Non superclasse, utilizzando Swift matrici, init list_of_things alla dichiarazione di lato, in init() non superclasse di inizializzare.

    class testClass {
    
      var list_of_things = []
    
      init () { 
      }
    }
    
    126> var abc = testClass ()
    abc: testClass = {
      list_of_things = @"0 objects"
    }
    127> abc.list_of_things
    $R55: __NSArrayI = @"0 objects"

Lascia un commento