如何将Struct初始化中的属性设置移至另一种方法

时间:2018-07-10 21:23:11

标签: swift struct initialization

所以我有一个结构,称为DemoType,我希望调用者使用两个属性对其进行初始化-但是我也想公开设置第二个属性的能力

问题在于,在设置prop2之前,有很多逻辑需要首先运行。 这意味着有很多重复的代码行,我正尝试通过将逻辑放在一个位置来减少这些重复行。我想将其全部保留在setProp2

struct DemoType {
    var prop1: String
    var prop2: String

    init?(p1:String, p2:String) {
        self.prop1 = p1
        let potentialFailure = true
        guard potentialFailure else { return nil }
        // Like 20 lines of logic here manipulating p2
        self.prop2 = p2
    }

    mutating func setProp2(_ p2:String) {
        let potentialFailure = true
        guard potentialFailure else { return }
        // Like 20 lines of logic here manipulating p2
        self.prop2 = p2
    }

}

因此,从逻辑上讲,我可以打电话给setProp,一切都会变得很酷

struct DemoType {
    var prop1: String
    var prop2: String

    init?(p1:String, p2:String) {
        self.prop1 = p1
        self.setProp2(p2)
    }

    mutating func setProp2(_ p2:String) {
        let potentialFailure = true
        guard potentialFailure else { return }
        // Like 20 lines of logic here manipulating p2
        self.prop2 = p2
    }

}

不幸的是,编译器会抱怨我没有初始化init中的所有属性,

,我也希望init为fallable,因此如果某些检查失败,它可以返回nil,所以我不确定该如何处理此实现,因为我可以使setProp2刚返回,但是如何使调用者(init)返回nil

我想我想做的事一定是可能的,但是我只是不知道编译器正在寻找的语法。或者,我可以将这20行逻辑提取到它自己的方法中,并都调用它,这样也会更简洁,但是由于最后都调用了self.prop2,所以我希望有一种方法可以在一个分配了self.prop2的地方

1 个答案:

答案 0 :(得分:2)

问题似乎是因为您的变异set函数可以在设置属性之前提前返回。我建议创建一个配置prop2的函数,并返回配置成功的prop或返回nil的不成功配置:

func setProp2(_ prop2: String) -> Prop2? {
  // set up 
  return prop2
}

现在,您既可以从初始化程序中也可以从变异集合函数中调用setProp2。这样可以减轻重复代码的问题。