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