Search code examples
classswiftsuper

'self' used before super.init call


I'm new to swift and I don't understand how to initialize a class.

Succeeded is initialized in the class definition as false

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

Time is initialized as

time = data[3].toInt()

Where data is

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

And raw_data is a string.

Class Definition:

class geocodeObject: NSObject {

init definition:

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

(no super init of any kind)

Full code with things cut way:

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

Solution

  • It had been a while but the answer I found is that you should add super.init() as the first line inside your init block

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

    This way I got rid of it and fulfills what the error is asking for. As I understand this is that your variables are initialized during NSObject.init() so you can use assigned values inside your custom init(_) block