Swift中的句法糖结构参考?

时间:2015-06-21 15:16:20

标签: swift

c++中,可以按如下方式引入别名引用

StructType & alias = lengthyExpresionThatEvaluatesToStuctType;
alias.anAttribute = value; // modify "anAttribute" on the original struct

Swift 中操作(值类型)结构是否有类似的语法糖?

更新1:例如:假设结构包含在类型字典[String:StructType]中,并且我喜欢修改结构myDict中的几个属性[&#34 ;你好&#34]。我可以制作该条目的临时副本。修改副本,然后将临时结构复制回字典,如下所示:

var temp = myDict["hello"]!
temp.anAttribute = 1
temp.anotherAttribute = "hej"
myDict["hello"] = temp

但是,如果我的函数有多个退出点,我必须在每个退出点之前编写myDict["hello"] = temp,因此我可以更方便地为myDict["hello"]引入和别名(引用) ,如下:

var &  alias = myDict["hello"]! // how to do this in swift ???
alias.anAttribute = 1
alias.anotherAttribute = "hej"

更新2:在关闭或关闭投票之前:请查看使用swift 构建更好的应用程序(来自WWWDC15)!! 值类型 Swift 的重要功能!您可能知道, Swift 借用了C++的多个功能,值类型可能是C++的最重要功能(当{{ 1}}与 Java 和此类语言进行比较)。说到值类型C++有一些语法糖,我的问题是:C++是否有类似的糖< / em>隐藏在其语言中?我确信Swift 拥有,最终......如果你不理解,请不要关闭这个问题!

我刚刚阅读了 Deitel关于Swift的书。虽然我不是专家(但是)我并不完全是小说。我想尽可能高效地使用 Swift

1 个答案:

答案 0 :(得分:1)

除了用作声明为inout的函数参数外,Swift并不允许引用语义来表示值类型。您可以将对结构的引用传递给适用于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。

如果您真的想,可以使用标准库函数withUnsafeMutablePointer获取原始指针。您也可以将值放入只有一个成员的内部类中。还有一些功能丰富的方法可以缓解早期退货问题。