如何声明一个包含struct引用的变量?

时间:2015-08-05 23:15:17

标签: swift

有这个:

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变量不是副本,而是我可以像对象引用一样修改其值的引用?

4 个答案:

答案 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"

因此,您可以看到youworld.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)