Swift 用不同的方法初始化属性
我有一个类,并使用默认值初始化属性:Swift 用不同的方法初始化属性,swift,class,init,Swift,Class,Init,我有一个类,并使用默认值初始化属性: class Point { var x : Int var y : Int public init() { x = 1 y = 1 } } 现在我想要一个reset()方法,它将属性设置为这些默认值。因为我想防止冗余,所以我尝试将行从初始值设定项移动到reset方法,并从init调用此方法: class Point { var x : Int var y : Int public init() { r
class Point {
var x : Int
var y : Int
public init() {
x = 1
y = 1
}
}
现在我想要一个reset()方法,它将属性设置为这些默认值。因为我想防止冗余,所以我尝试将行从初始值设定项移动到reset方法,并从init调用此方法:
class Point {
var x : Int
var y : Int
public init() {
reset()
}
public func reset() {
x = 1
y = 1
}
}
但它不起作用。它说属性必须初始化。如何解决此问题?如下所示,声明属性为可选属性
class Point {
var x : Int!
var y : Int!
public init() {
reset()
}
public func reset() {
x = 1
y = 1
}
}
实际上,您可以在属性声明中提供默认值:
class Point {
var x: Int = 1
var y: Int = 1
public init() {
// No need to reset x & y
// You can event omit init alltogether, if all properties have default values...
}
public func reset() {
x = 1
y = 1
}
}
您可以在声明时初始化属性
class Point {
var x : Int = 1
var y : Int = 1
public init() {
}
public func reset() {
x = 1
y = 1
}
虽然它添加了一些复制,但它确实解决了您的问题您可以完全跳过初始化
class Point {
var x = 1
var y = 1
public func reset() {
x = 1
y = 1
}
}
您可以有两个私有类型成员,它们保存
x
和y
属性的默认值,并将其用作初始值设定项中的默认参数值(以及在重置点
实例时使用):
您应该在类初始值设定项中指定一个默认值。注意,结构是首选的,这是一个简单的轻量级类,可以考虑使它不可变。这样你就不会有问题了
结构点{let x:Int let y:Int init(x:Int=1,y:Int=1){self.x=x self.y=y}
我知道我必须在初始值设定项中设置默认值,但这不是我的用例。我想有一个类,这是在应用程序启动时创建,修改,然后我想“重置”到这些默认值在以后的时间。我知道我可以在init()和第二个reset()方法中使用相同的代码行,但这更糟糕。为什么会被否决?使它们成为可选的是否不好?也可以使用optionals,但我不想进行大量的展开工作。但是,我有两次所有属性。@altralaser,但您没有重复的键入文字值,这意味着如果您选择将默认值更新到点
类,您只需要在单个位置(在类型属性处)执行此更新。但是,预设属性或使用init方法进行更新是否会有所不同?如果没有复制品,这似乎是不可能的。但你的解决方案有效,所以我接受了。
class Point {
static private let xDefault = 1
static private let yDefault = 1
var x: Int
var y: Int
public init(x: Int = Point.xDefault, y: Int = Point.yDefault) {
self.x = x
self.y = y
}
public func reset() {
x = Point.xDefault
y = Point.yDefault
}
}
let p1 = Point()
print(p1.x, p1.y) // 1 1
let p2 = Point(y: 2)
print(p2.x, p2.y) // 1 2
p2.reset()
print(p2.x, p2.y) // 1 1
let p3 = Point(x: -1, y: 2)
print(p3.x, p3.y) // -1 2
p3.reset()
print(p3.x, p3.y) // 1 1