在另一个方法中初始化属性

时间:2017-01-27 10:12:26

标签: 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() {
    reset()
  }

  public func reset() {
    x = 1
    y = 1
  }
}

但它不起作用。它说必须初始化属性。我该如何解决这个问题?

5 个答案:

答案 0 :(得分: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
    }
}

答案 1 :(得分:1)

您可以在声明

上初始化您的属性
class Point {
  var x : Int = 1
  var y : Int = 1

  public init() {
  }

  public func reset() {
    x = 1
    y = 1
  }

虽然它增加了一些重复,但它肯定能解决你的问题

答案 2 :(得分:1)

您可以拥有两个包含xy属性默认值的私有类型成员,并将这些成员用作初始值设定项中的默认参数值(以及在重置Point实例时使用这些:

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

答案 3 :(得分:0)

你可以完全跳过init ......

class Point {
    var x = 1
    var y = 1

    public func reset() {
        x = 1
        y = 1
    }
}

答案 4 :(得分:-1)

声明您的属性可选,如下所示。

class Point {
  var x : Int!
  var y : Int!

  public init() {
    reset()
  }

  public func reset() {
    x = 1
    y = 1
  }
}