web-dev-qa-db-fra.com

'self' utilisé avant l'appel super.init

Je suis nouveau à Swift et je ne comprends pas comment initialiser une classe.

Réussi est initialisé dans la définition de classe comme false

if (succeeded && (time>1000)){
   errormessage += ";connection slow"
 }

Le temps est initialisé comme

time = data[3].toInt()

Où les données sont

var data = split(raw_data) {$0 == ","}

Et raw_data est une chaîne.

Définition de classe:

class geocodeObject: NSObject {

init définition:

init(lat: String,long:String,userstate:String) {

(pas de super init d'aucune sorte) EDIT: Code complet avec les choses coupées

class geocodeObject: NSObject {
//A type to store the data from the Reverse Geocoding API
//Not a retriever

//Options
let API_KEY_TEXAS = "9e4797c018164fdcb9a95edf3b10ccfc"
let DEV_MODE = true
//Loading status
var succeeded = false
var errormessage = "Not Initalized" //Not nesscarilly a failure, could be slow connection
var loadstate: String?
//Most important info
var street: String?; var housenumber: String?; var city: String?; var Zip: String?
//Metadata
var time: IntegerLiteralType?; var statuscode: String?; var queryid: String?; var Zip4: String?
//Other geographical data
var entirestreet: String?; var state: String?
init(lat: String,long:String,userstate:String) {
    //userstate: State provided by user
    //state: State provided by Reverse Geocoder

    var url: String?
    var extra: String?
    if DEV_MODE{
        extra = "&notStore=true"
    }
    else{
        extra = ""
    }
    url = "http://geoservices.tamu.edu/Services/ReverseGeocoding/WebService/v04_01/HTTP/default.aspx?lat="+lat+"&lon="+long+"&apikey="+API_KEY_TEXAS+"&version=4.01"
    if (userstate == "nil"){
        url = url! + extra!
        println("if")
    }
    else{
        url = url! + "&state="+state!+extra!
        println("else")
    }

    let raw_data = retrieveurl(url!)
    var data = split(raw_data) {$0 == ","}
    //data[1] is API version used.
    statuscode = data[0]; queryid = data[2]; time = data[3].toInt(); entirestreet = data[4]; city = data[5]
    state = data[6]; Zip = data[7]; Zip4 = data[8]
    //Do street, housenumber, errormessage, succeeded
    if (state != userstate){
        println("user state not equal to state")
    }
    var splittedstreet = split(entirestreet!){$0 == " "}
    housenumber = splittedstreet[0]
    street = splittedstreet[1]
    println(statuscode)
    //Error message handling
    switch String(statuscode!){
        case "200":
            errormessage = "Success"
        case "400":
            errormessage = "Unknown API key error"
        case "401":
            ...
    //Time handling
    if (succeeded && (time>1000)){
        errormessage += ";connection slow"
    }
   }
    println("/GeocodingAPIWrapper.Swift/.geocodeObject.init: Not Implemented")
}

}

19
noɥʇʎԀʎzɐɹƆ

Cela faisait un moment mais la réponse que j'ai trouvée est que vous devriez ajouter super.init () comme première ligne à l'intérieur de votre bloc init

init(lat: String,long:String,userstate:String) {
    super.init()
    ...

De cette façon, je m'en suis débarrassé et remplis ce que l'erreur demande. Si je comprends bien, c'est que vos variables sont initialisées pendant NSObject.init () afin que vous puissiez utiliser les valeurs affectées dans votre bloc init (_) personnalisé

34
Haac74

Swift 2.2 (toujours bêta au moment de l'écriture) affiche actuellement cette erreur si vous oubliez accidentellement de return nil à partir d'un guardelse:

required init?(dictionary: [String: AnyObject]) {

    guard let someValue = dictionary["someValue"] as? Bool else { return /*nil*/ } //Nil should not be commented here
    self.someValue = someValue

    super.init(dictionary: dictionary) //`self` used before super.init call
}

J'espère que cela aide quelqu'un

28
Max Chuquimia