首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >swift:引用传递

swift:引用传递
EN

Stack Overflow用户
提问于 2016-06-10 19:48:08
回答 2查看 307关注 0票数 0

来自JS,并试图通过引用传递JSON,这是不可能的,所以我尝试将它包装在对象中,并使用一个仍然不起作用的原语做了一个简单的示例,如何包装成员a,从而更改引用的对象a影响b?谢谢

代码语言:javascript
复制
class ExampleA {
    var a = 0
    init(a: Int) {
        self.a = a
    }
}
class ExampleB {
    var a = 0
    init(a: Int) {
        self.a = a
    }
    func process(inout p: ExampleA) {
        self.a = p.a
        print(p.a)
    }
}

var a = ExampleA(a: 15)
var b = ExampleB(a: 10)

b.process(&a)

print(b.a)  // "15\n"
a.a = 25    // this does nothing to b????
print(b.a)  // "15\n"
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-10 20:04:24

您的示例失败,因为a是一个Int,它是一个值类型。

当您做作业self.a = p.a时,您正在制作Int的副本。

要实现所需的引用语义,您必须保存用于存储值类型的引用( ExampleA )。我认为您因为变量命名而感到困惑,混淆了ExampleAa : Int成员和名为aExampleA实例。

这是我安排好的解决办法。它为ExampleB提供了一个计算属性,它透明地访问ExampleA中的data

代码语言:javascript
复制
class ExampleA {
    var data = 0
    init(data: Int) {
        self.data = data
    }
}

class ExampleB {
    var a : ExampleA

    var data : Int {
        get {
            return a.data
        }
        set {
            a.data = newValue
        }
    }

    init(data: Int) {
        self.a = ExampleA(data: data)
    }

    func process(a: ExampleA) {
        self.a = a
        print(a.data)
    }
}

var a = ExampleA(data: 15)
var b = ExampleB(data: 10)

b.process(a: a)

print(b.data)  // "15\n"
a.data = 25 
print(b.data)  // "25\n"
票数 1
EN

Stack Overflow用户

发布于 2016-06-10 20:08:02

简单的委托不需要任何实际的inout或引用语义:

代码语言:javascript
复制
class ExampleA {
    var a = 0
    init(a: Int) {
        self.a = a
    }
}
class ExampleB {
    var aObject: ExampleA
    init(a: ExampleA) {
        self.aObject = a
    }

    func a() -> Int {
        return aObject.a
    }
}

var a = ExampleA(a: 15)
var b = ExampleB(a: a)


print(b.a())
a.a = 25
print(b.a())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37756087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档