具有self.variable = variable的初始化程序

时间:2017-01-11 19:43:31

标签: swift

我是Swift的新手。我不明白以下示例中 self.seconds = seconds 的目的是什么:

class Time {
    var seconds:Double = 0

    init(seconds: Double) {
        self.seconds = seconds
    }

    var minutes: Double {
        get {
            return (seconds / 60)
        }
        set {
            self.seconds = (newValue * 60)
        }
    }

    var hours: Double {
        get {
            return (seconds / (60 * 60))
        }
        set {
            self.seconds = (newValue * (60 * 60))
        }
    }
}

根据xcode' self.seconds'是一个变量和'秒''是一个不变的。我很困惑。有什么想法吗?

4 个答案:

答案 0 :(得分:1)

在初始化程序的范围内,您有一个本地常量seconds和一个变量属性seconds(您使用self.seconds访问它以避免混淆)。

为了减少混淆,您可以将初始化程序的参数重命名为newSeconds

init(seconds newSeconds: Double) {
    self.seconds = newSeconds
}

这不会改变您调用初始值设定项的方式(您仍然使用标签seconds:,但初始化程序不那么令人困惑。

答案 1 :(得分:0)

初始化Time对象时,将传入的秒数作为参数存储到成员变量中(也称为秒)。您可以想象如果您有几分钟或几小时的其他初始化程序,它会转换分钟或小时,然后将它们存储为秒。例如:

class Time {
    var seconds:Double = 0

    init(seconds: Double) {
        self.seconds = seconds
    }

    init(minutes: Double) {
        self.seconds = minutes * 60
    }

    init(hours: Double) {
        self.seconds = hours * 60 * 60
    }

    var minutes: Double {
        get {
            return (seconds / 60)
        }
        set {
            self.seconds = (newValue * 60)
        }
    }

    var hours: Double {
        get {
            return (seconds / (60 * 60))
        }
        set {
            self.seconds = (newValue * (60 * 60))
        }
    }
}

仅仅因为参数与Time对象的变量同名,并不意味着它自动包含相同的值。

答案 2 :(得分:0)

传递非可选参数时有三个选项:

  • 您使用默认值声明属性并在init中覆盖它(不推荐):

    var seconds : Double = 0.0 // or even var seconds = 0.0 (the compiler infers the Double type)
    
    init(seconds: Double) {
        self.seconds = seconds
    }
    
  • 您声明属性并在init中指定默认值:

    var seconds : Double
    
    init(seconds: Double) {
        self.seconds = seconds
    }
    
  • 您将该属性声明为常量(只读),并在init

    中指定值
    let seconds : Double
    
    init(seconds: Double) {
        self.seconds = seconds
    }
    

在任何情况下,self.seconds代表属性,seconds代表传递的参数。

答案 3 :(得分:0)

如果实例化var seconds:Double = 0,则调用init方法。 let time = Time() //calls init(). time has default value of zero seconds 定义了默认值。

let time = Time(seconds: 42.0) //calls init(seconds: Double). time has been initialized with 42 seconds

如果您调用其中一个参数化的init方法,则会覆盖默认值:

var input = document.getElementById("hello");
input.addEventListener('blur', function() {
  alert('hello');
  input.select();
  input.focus();
});