在c++
中,可以按如下方式引入别名引用:
StructType & alias = lengthyExpresionThatEvaluatesToStuctType;
alias.anAttribute = value; // modify "anAttribute" on the original struct
在swift中操纵(值类型)结构是否有类似的语法甜头?
更新1:例如:假设结构包含在类型为[string:structtype]的字典中,并且我喜欢修改结构mydict[“hello”]中的几个属性。我可以暂时复制那条记录。修改副本,然后将临时结构复制回字典,如下所示:
var temp = myDict["hello"]!
temp.anAttribute = 1
temp.anotherAttribute = "hej"
myDict["hello"] = temp
但是,如果我的函数有多个出口点,我将不得不在每个出口点之前写入
myDict["hello"] = temp
,因此,如果我可以只为myDict["hello"]
引入和别名(reference),这将更加方便,如下所示:var & alias = myDict["hello"]! // how to do this in swift ???
alias.anAttribute = 1
alias.anotherAttribute = "hej"
更新2:在向下或接近投票之前,这个问题:请看用swift(来自wwdc15)构建更好的值类型应用程序!!值类型是swift的一个重要特性!正如您所知道的,SWIFT从
C++
中借用了几个特性,并且值类型可能是C++
的最重要的特征(当C++
与Java和此类语言相比)。当涉及到值类型时,C++
有一些语法上的糖分,我的问题是:Swift
是否在其语言中隐藏了类似的糖分?我相信最终会…请不要结束投票这个问题,如果你不明白!我刚刚读了迪特尔关于斯威夫特的书。虽然我还不是一个专家,但我还不是一个完全新颖的人。我正在尽可能地使用swift!
最佳答案
Swift一般不允许对值类型使用引用语义,除非用作声明为inout
的函数参数。您可以将对结构的引用传递给一个在inout版本上工作的函数(我相信,需要引用,这是作为一个复制-写入而不是作为内存引用实现的)。您还可以在嵌套函数中捕获变量以实现类似的语义。在这两种情况下,您都可以从变化函数中提前返回,同时仍然保证适当的分配。以下是我在xcode 6.3.2和xcode 7-beta1中运行的示例操场:
//: Playground - noun: a place where people can play
import Foundation
var str = "Hello, playground"
struct Foo {
var value: Int
}
var d = ["nine": Foo(value: 9), "ten": Foo(value: 10)]
func doStuff(key: String) {
let myNewValue = Int(arc4random())
func doMutation(inout temp: Foo) {
temp.value = myNewValue
}
if d[key] != nil {
doMutation(&d[key]!)
}
}
doStuff("nine")
d // d["nine"] has changed... unless you're really lucky
// alternate approach without using inout
func doStuff2(key: String) {
if var temp = d[key] {
func updateValues() {
temp.value = Int(arc4random())
}
updateValues()
d[key] = temp
}
}
doStuff2("ten")
d // d["ten"] has changed
您不必使嵌套在外部函数中的
doMutation
函数,我只是这样做来演示您可以从周围函数中捕获myNewValue
之类的值,这可能使实现更容易。但是,必须嵌套updateValues
,因为它捕获了temp
。尽管如此,基于您的示例代码,我认为在这里使用一个类(如果您关心性能的话,可能是最后一个类)确实是更惯用的命令式风格的swift。
如果您真的想,可以使用标准库函数获取原始指针。您也可以将该值丢弃到只有一个成员的内部类中。还有一些功能性的方法可以缓解早期回报问题。
关于swift - Swift中的句法糖结构引用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30966073/