代码之家  ›  专栏  ›  技术社区  ›  Roman Podymov

用为其参数提供默认值的init函数初始化对象

  •  2
  • Roman Podymov  · 技术社区  · 8 年前

    我有以下课程:

    final class A {
    
        let propertyA: Int
        let propertyB: String
        let propertyC: Double
    
        init(propertyA: Int = 100, propertyB: String = "propertyB", propertyC: Double = 10.0) {
            self.propertyA = propertyA
            self.propertyB = propertyB
            self.propertyC = propertyC
        }
    }
    

    如您所见,它的所有属性定义为 let 和 init 为它们提供一些默认值。要创建此类的实例,我使用一些非常量数据:

    var a: Int? = nil // Some random values that can be nil
    var b: String? = "b"
    var c: Double? = 100.0
    

    下面是一个非常巨大的代码片段,它创建了 A :

    let objectA: A
    if let a = a, let b = b, let c = c {
        objectA = A(propertyA: a, propertyB: b, propertyC: c)
    } else if let a = a, let b = b {
        objectA = A(propertyA: a, propertyB: b)
    } else if let b = b, let c = c {
        objectA = A(propertyB: b, propertyC: c)
    } else if let a = a, let c = c {
        objectA = A(propertyA: a, propertyC: c)
    } else if let a = a {
        objectA = A(propertyA: a)
    } else if let b = b {
        objectA = A(propertyB: b)
    } else if let c = c {
        objectA = A(propertyC: c)
    } else {
        objectA = A()
    }
    

    初始化 objectA 太大了,我想找个办法把它变小。但是我不想申报 一 的属性为 var .

    1 回复  |  直到 8 年前
        1
  •  3
  •   Martin R    8 年前

    switch (a, b, c) {
    case (let a?, let b?, let c?):
        objectA = A(propertyA: a, propertyB: b, propertyC: c)
    case (nil, let b?, let c?):
        objectA = A(propertyB: b, propertyC: c)
    case (let a?, nil, let c?):
        objectA = A(propertyA: a, propertyC: c)
    case (let a?, let b?, nil):
        objectA = A(propertyA: a, propertyB: b)
    case (let a?, nil, nil):
        objectA = A(propertyA: a)
    case (nil, let b?, nil):
        objectA = A(propertyB: b)
    case (nil, nil, let c?):
        objectA = A(propertyC: c)
    case(nil, nil, nil):
        objectA = A()
    }
    

    nil

    final class A {
    
        let propertyA: Int
        let propertyB: String
        let propertyC: Double
    
        init(propertyA: Int? = nil, propertyB: String? = nil, propertyC: Double? = nil) {
            self.propertyA = propertyA ?? 100
            self.propertyB = propertyB ?? "propertyB"
            self.propertyC = propertyC ?? 10.0
        }
    }
    

    A

    var a: Int? = nil // Some random values that can be nil
    var b: String? = "b"
    var c: Double? = 100.0
    
    let objectA = A(propertyA: a, propertyB: b, propertyC: c)