在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 !
答案 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
获取原始指针。您也可以将值放入只有一个成员的内部类中。还有一些功能丰富的方法可以缓解早期退货问题。