有这个:
struct Person {
var name = "Noname"
}
class World {
var person: Person!
func changePersonName(newName: String) {
person.name = newName
}
}
let you = Person(name: "Adam")
let world = World()
world.person = you
world.changePersonName("Eve")
println(you.name) // not "Eve", still "Adam"
就我而言,我希望person.name
成为" Eve"。
我的问题是如何使person
中的World
变量不是副本,而是我可以像对象引用一样修改其值的引用?
答案 0 :(得分:2)
如果您想要'引用类型'而不是'值类型',请使用class
,而不是struct
。
class Person {
var name = "Noname"
}
class World {
var person = Person()
changePersonName (name: String) {
person.name = name
}
}
答案 1 :(得分:1)
正如GoZoner所说,如果你想通过其他引用来改变一个Person的副作用,你需要一个类,而不是一个结构。这正是类和结构之间的主要区别之一。结构是一种值类型;类是引用类型。因此,从您的示例代码开始并修复它以便实际编译:
struct Person {
var name = "Noname"
}
class World {
var person: Person!
func changePersonName(newName: String) {
person.name = newName
}
}
let you = Person(name: "Adam")
let world = World()
world.person = you
world.changePersonName("Eve")
print(you.name) // "Adam"
print(world.person.name) // "Eve"
因此,您可以看到you
和world.person
是人的两个不同实例。它们不是对同一个实例的引用。这通常被认为是一件好事,但如果由于某种原因,这不是你想要的,那么使用一个类:
class Person {
var name = "Noname"
init(name:String) {self.name = name}
}
class World {
var person: Person!
func changePersonName(newName: String) {
person.name = newName
}
}
let you = Person(name: "Adam")
let world = World()
world.person = you
world.changePersonName("Eve")
print(you.name) // "Eve"
print(world.person.name) // "Eve"
答案 2 :(得分:0)
如果您真的想要引用结构,那么<ResourceDictionary.ThemeDictionaries>
<ResourceDictionary x:Key="Default">
<SolidColorBrush x:Key="SystemControlHighlightAccentBrush" Color="Orange" />
</ResourceDictionary>
<ResourceDictionary x:Key="Dark">
<SolidColorBrush x:Key="SystemControlHighlightAccentBrush" Color="Green" />
</ResourceDictionary>
<ResourceDictionary x:Key="Light">
<SolidColorBrush x:Key="SystemControlHighlightAccentBrush" Color="Blue" />
</ResourceDictionary>
</ResourceDictionary.ThemeDictionaries>
是您的选择,但我不建议您使用它。
答案 3 :(得分:0)
正如s1ddok指出的那样,你可以使用UnsafeMutablePointer
:
struct Person {
var name = "Noname"
}
class World {
var person: UnsafeMutablePointer<Person>!
func changePersonName(newName: String) {
person.memory.name = newName
}
}
var you = Person(name: "Adam")
var ptr = UnsafeMutablePointer<Person>.alloc(1)
ptr.initialize(you)
let world = World()
world.person = ptr
world.changePersonName("Eve")
print(ptr.memory.name)