swift 具有下标结构的计算属性

amrnrhlw  于 11个月前  发布在  Swift
关注(0)|答案(1)|浏览(110)

我有一个struct ExampleStruct和一个自定义的subscript。结构数据是一个固定的私有字典value。该结构有一个元素Sum,它本质上是私有字典中其他元素的总和

struct ExampleStruct {
   private var value: [String:Double] {
     didSet {
     value["Sum"] = value.filter{$0.key != "Sum"}.reduce(0.+)
     }
   }

   init(){
      value = ["Ind1":12, "Ind2":13, "Sum":25]
   }
   subscript(index: String) -> Double {
     get {
// some error checking too about index
       return value[index]
     }
     set {
       value[index] = newValue
     }

字符串
我想使用这个结构作为一个计算属性,它依赖于另一个函数,该函数通过另一个依赖函数依赖于具有“Sum”索引的结构的值。sampleFunc类似于:

func sampleFunc() -> ExampleStruct {
...
     sampleFunc2(sum: exampleImplementation["Sum"])
...
}


我使用了以下代码,但它是递归的:

var exampleImplementation: ExampleStruct {  
     return sampleFunc()   //sampleFunc depends on exampleImplementation["Sum"]
                     //func returns ExampleStruct   
   }
}


但我只需要函数来设置“Sum”以外的索引。所以我想要这样的东西:

var exampleImplementation: ExampleStruct {  
   if INDEX=="SUM" {   //
      return SOME BACKING VALUE 
   } else {
     return sampleFunc()[INDEX NOT EQUAL TO "Sum"]   //func depends on exampleImplementation["Sum"]
                     //func returns ExampleStruct   
   }
}


对于在计算属性中有下标的结构,有没有一种方法可以实现这一点?

tkclm6bt

tkclm6bt1#

如果我们忽略不一致的代码,那么解决方案不是简单地向subscript方法的set部分添加一个过滤器吗?

set {
    if index == "Sum" { return }
    value[index] = newValue
}

字符串
我的完整结构版本

struct ExampleStruct {
    static let Sum = "Sum"
    private var value: [String:Double] {
        didSet {
            value[Self.Sum] = value.filter{$0.key != Self.Sum}.map(\.value).reduce(0 , +)
        }
    }

    init(){
        value = ["Ind1":12, "Ind2":13, "Sum":25]
    }
    subscript(index: String) -> Double? {
        get {
            value[index]
        }
        set {
            if index == Self.Sum { return }
            value[index] = newValue
        }
    }

    var sum: Double {
        value[Self.Sum, default: 0]
    }
}


var example = ExampleStruct()

example["Ind1"] = 3
example["Ind2"] = 3
example["Ind3"] = 3
example[ExampleStruct.Sum] = 3
print(example.sum)


9.0

相关问题