Frederic
Frederic

Reputation: 497

swift convenience initializer error: must precede argument

I've been trying to create my first convenience initializer. I'm getting this error:

I get the error: Argument 'valueInDollars' must precede argument 'serialNumber'

Here is all of my code, my problem is at the bottom of my code here, but I thought it was useful to show everything.

import UIKit

class Item: NSObject {

var name: String
var valueInDollars: Int
var serialNumber: String?
let dateCreated: NSDate



init(name: String, valueInDollars: Int, serialNumber: String?) {

self.name = name
    self.valueInDollars = valueInDollars
self.serialNumber = serialNumber
    self.dateCreated = NSDate()

    super.init()

}

//create a random item:

convenience init(random: Bool = false) {

    if random {

    let adjectives = ["Fluffy", "Rusty", "Bluffy"]
        let nouns = ["Boon", "Noon", "Toon",]

    var idx = arc4random_uniform(UInt32(adjectives.count))
    let randomAdjective = adjectives[Int(idx)]

        idx = arc4random_uniform(UInt32(nouns.count))
        let randomNoun = nouns[Int(idx)]


        let randomName = "\(randomAdjective) \(randomNoun)"

        let randomValue = Int(arc4random_uniform(100))

        let randomSerialNumber = NSUUID().UUIDString.componentsSeparatedByString("-").first!


        self.init(name: randomName, serialNumber: randomSerialNumber, valueInDollars: randomValue)
    }
    else {

        self.init(name: "", serialNumber: nil, valueInDollars: 0)



    }
}
}

Upvotes: 0

Views: 817

Answers (3)

90arther
90arther

Reputation: 1

The project “Homepwner” contains source code developed with Swift 3.x. This version of Xcode does not support building or migrating Swift 3.x targets.

There are two option for you:

  1. Use Xcode 10.1 to migrate the code to Swift 4.
  2. fix code
//
//  Item.swift
//  Homepwner
//
//  Created by Arther Smith on 10/17/21.
//

import UIKit

class Item: NSObject {
    var name: String
    var valueInDollars: Int
    var serialNumber: String?
    let dateCreated: NSDate
    
    init(name: String, serialNumber: String?, valueInDollars: Int) {
        self.name = name
        self.valueInDollars = valueInDollars
        self.serialNumber = serialNumber
        self.dateCreated = NSDate()

        super.init()
    }
    
    convenience init(random: Bool = false) {
        if random {
            let adjectives = ["Fluffy", "Rusty", "Shiny"]
            let nouns = ["Bear", "Spork", "Mac"]
            
            var idx = arc4random_uniform(UInt32(adjectives.count))
            let randomAdjective = adjectives[Int(idx)]
            
            idx = arc4random_uniform(UInt32(nouns.count))
            let randomNoun = nouns[Int(idx)]
            
            let randomName = "\(randomAdjective) \(randomNoun)"
            let randomValue = Int(arc4random_uniform(100))
            let randomSerialNumber = NSUUID().uuidString.components(separatedBy: "-").first!
            
            self.init(name: randomName, serialNumber: randomSerialNumber,valueInDollars: randomValue)
            
            
        } else {
            self.init(name: "", serialNumber: nil, valueInDollars: 0)
        }
    }
}

Upvotes: 0

Arnaud Wurmel
Arnaud Wurmel

Reputation: 500

You should call the init with same order of params you used when you defined the init itself

self.init(name: "", valueInDollars: 0, serialNumber: nil)

Upvotes: 2

Frederic
Frederic

Reputation: 497

The solution: I needed to call my init in the right order, so it corresponded with my variables.

Upvotes: 0

Related Questions