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/

10-11 09:11
查看更多