'self' used before super.init call

34,006

Solution 1

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

Solution 2

Swift 2.2 (still beta as of writing) currently displays this error if you accidentally forget to return nil from a guard's else:

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
}

Hopefully this helps someone

Share:
34,006
noɥʇʎԀʎzɐɹƆ
Author by

noɥʇʎԀʎzɐɹƆ

CrazyPython is an expert in disliking profiles written in the third person. With over ten years of experience at breathing... You can contact me at my email, jamtlu+so (at) gmail dot com.

Updated on July 25, 2022

Comments

  • noɥʇʎԀʎzɐɹƆ
    noɥʇʎԀʎzɐɹƆ almost 2 years

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

    }