jaysoncopes
jaysoncopes

Reputation: 854

No Class/Struct Autocomplete in Swift

I currently have two structs and a class in my sample code. One struct is for Tiger, one is for Balloon and on is for Lion. Each are below:

struct Tiger {
    var name = ""
    var age = 0
    var breed = ""
    var image = UIImage(named: "")
    func chuff() {
        println("\(name): Chuff Chuff")
    }
    func chuffNumberOfTimes(numberOfTimes:Int) {
        for (var i = 0; i < numberOfTimes; i++) {
            self.chuff()
        }
    }
    func ageInTigerYearsFromAge(regularAge:Int) -> Int {
        return regularAge * 3
    }
    func randomFact() -> String {
        let randomFactNumber = Int(arc4random_uniform(UInt32(3)))
        var randomFact:String
        switch randomFactNumber {
        case 0:
            randomFact = "Tigers are 10 feet tall."
        case 1:
            randomFact = "Tigers are amazing."
        case 2:
            randomFact = "Tigers have 10 feet."
        default:
            randomFact = ""
        }
        return randomFact
    }
}
struct Balloon {
    var number = 0
    var image = UIImage(named: "")
}
class Lion {
    var name = ""
    var age = 0
    var isAlphaMale = false
    var image = UIImage(named: "")
    var subSpecies = ""
}

Each one is in its own file named identically to the struct/class & ".swift". However, the only one that autocompletes itself while typing in ViewController.swift is the Tiger struct. For instance, if I were to set myTiger = Tiger( it would suggest name: String, age: Int etc. How can I get the other two to do the same? I really like defining the variables inline instead of having 5 lines of code to define all of the variables.

Is anyone familiar with how that works or why the Tiger struct would do it while the Balloon and Lion structs don't?

Upvotes: 1

Views: 1043

Answers (1)

Icaro
Icaro

Reputation: 14845

Classes don't get the initializers for free as the Struct does, if you want to have an initializer for a class you have to create it:

class Lion {
    var name = ""
    var age = 0
    var isAlphaMale = false
    var image = UIImage(named: "")
    var subSpecies = ""

    init(name: String, age:Int, isAlphaMale: Boolean, image: UIImage, subSpecies: String){
        self.name = name 
        self.age = age 
        self.isAlphaMale = isAlphaMale 
        self.image = image 
        self.subSpecies = subSpecies 
    }
} 

The Balloon should work automatically, probably a clean and build in your code so xcode can be updated will fix the problem.

From Apple Documentation:

Memberwise Initializers for Structure Types

All structures have an automatically-generated memberwise initializer, which you can use to initialize the member properties of new structure instances. Initial values for the properties of the new instance can be passed to the memberwise initializer by name:


copied from a previus part of the document to add context

struct Resolution { var width = 0 var height = 0 }


let vga = Resolution(width: 640, height: 480)

Unlike structures, class instances do not receive a default memberwise initializer.

With the class above you will have the initializer as in the screenshot below:

enter image description here

As you can see in the screenshot Balloon works perfectly fine as well

enter image description here

No need to enter once to start work, xcode is not perfect and sometimes it needs a clean and a new build to make it be in sync with your classes and structs.

Upvotes: 2

Related Questions