如何设置计算属性的值

如何设置计算属性的值

问题描述:

我想将值设置为类型dictionary的计算属性中的键。我想要做这样的事情:如何设置计算属性的值

class Foo { 
    var dict: [String: String] { 
     dict["a"] = "b" 
    } 
} 

然而,这并没有编译。

无法通过下标分配:“快译通”是一个GET-唯一的财产

我可以做这样的事情,但它是一个有点冗长:

class Foo { 
    var values: [String: String] { 
     var tempValues = [String: String]() 
     tempValues["a"] = "b" 
     return tempValues 
    } 
} 

有没有更好的办法这样做?对于上下文,我想实现的是在默认情况下dict在基类中是一个空的[String: String](),并且当我重写子类中的属性时,我想将值分配给所述字典。

当我重写子类中的属性时,我想将值分配给所述字典。

EHH ......只要做到这一点:

class A { 
    var dict: [String: String] { 
     return [:] 
    } 
} 

class B: A { 
    override var dict: [String : String] { 
     return ["Hello":"Hi"] 
    } 
} 

你忘了override关键字?

+0

这是有道理的,但我越来越挂在'返回[“你好”:“嗨”]'。如果说你有'C级',你会如何修改字典? – Aaron

+0

@Aaron和你在'B'完全一样,只是改变返回值。 – Sweeper

+0

对,但是到底是什么?如果在我覆盖之前有20个k-v对,它不会让我分配'food [“bar”] =“baz”'。 – Aaron

语法

var dict: [String: String] { 
    dict["a"] = "b" 
} 

var dict: [String: String] { 
    get { 
     dict["a"] = "b" 
    } 
} 

其指示只读属性的缩写形式。

您需要添加set之三

var dict: [String: String] { 
    get { 
     return [:] 
    } 
    set { 
     dict["a"] = "b" 
    } 
} 

但要小心,你很容易碰到一个无限循环,当你调用自身的setter(它确实在这个例子中)。

实际上这种计算属性只有在您要映射另一个值时才有用。

+0

'var dict:[String:String]'有一个返回'return dict [一个不是'[String:String]'类型的“]!'。是对的吗? – Aaron

+0

是的,没错,我更新了答案,但正如前面提到的那样,这个语法无论如何都不是很有意义。 – vadian