Swift subclassing - how to override Init()

前端 未结 4 594
面向向阳花
面向向阳花 2021-02-01 13:40

I have the following class, with an init method:

class user {
  var name:String
  var address:String

  init(nm: String, ad: String) {
    name = nm
    address          


        
相关标签:
4条回答
  • 2021-02-01 13:51

    In swift 2.0 and Later it works like this (all cases)

    init(newString:String) {
        super.init(string:newString)
        // Designed initialiser 
    }
    override init(someString: String) {
        super.init(mainString: someString)
        // Override initialiser when subclass some class 
    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
        // Some boilerplate code to handle error (needed when override)
    }
    convenience init(newString:String, withParameters:Dictionary<String,String>) {
        self.init(someString:newString)
        //Convenience initialiser 
    }
    
    0 讨论(0)
  • 2021-02-01 13:57

    Have you tried setting a value to numberPriorVisits and changing the types for the calls to super

    class user {
        var name:String
        var address:String
    
        init(nm: String, ad: String) {
            name = nm
            address = ad
        }
    }
    
    
    class registeredUser : user {
        var numberPriorVisits: Int;
    
        init(nm: String, ad: String) {
            self.numberPriorVisits = 0;
            super.init(nm: nm, ad: ad)
        }
    }
    
    0 讨论(0)
  • 2021-02-01 14:00

    You pass arguments to an initializer much like you pass arguments to a normal method:

    init(nm: String, ad: String) {  
        super.init(nm: nm, ad: ad) 
    }
    

    For reference, this is shown in the Designated and Convenience Initializers In Action section of the Swift Language Guide.

    0 讨论(0)
  • 2021-02-01 14:08

    In addition to Chuck's answer, you also have to initialize your new introduced property before calling super.init

    A designated initializer must ensure that all of the properties introduced by its class are initialized before it delegates up to a superclass initializer. (The Swift Programming Language -> Language Guide -> Initialization)

    Thus, to make it work:

    init(nm: String, ad: String) {
        numberPriorVisits = 0  
        super.init(nm: nm, ad: ad) 
    }
    

    This simple initialization to zero could have been done by setting the property's default value to zero too. It's also encouraged to do so:

    var numberPriorVisits: Int = 0
    

    If you don't want such a default value it would make sense to extend your initializer to also set a new value for the new property:

    init(name: String, ads: String, numberPriorVisits: Int) {
        self.numberPriorVisits = numberPriorVisits
        super.init(nm: name, ad: ads)
    }
    
    0 讨论(0)
提交回复
热议问题