我是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'是一个变量和'秒''是一个不变的。我很困惑。有什么想法吗?
答案 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();
});