在Swift编程语言中,它说:
"Swift整数,浮点数,布尔值,字符串,数组和字典中的所有基本类型都是值类型,并且在幕后实现为结构."
" 结构实例总是按值传递,类实例总是通过引用传递"
"如果将Array实例分配给常量或变量,或者将Array实例作为参数传递给函数或方法调用,则不会在分配或调用发生时复制该数组的内容.相反,两个数组共享相同的元素值序列.当你通过一个数组修改元素值时,结果可以通过另一个数组观察到."
很明显,Swift在阵列方面自相矛盾.数组是值类型还是引用类型?
我正在尝试获取Array对它的引用并对其进行修改.因为ArraySwift中的s是值类型而不是引用类型,如果我首先将我的数组赋值给变量,我得到的是数组的副本而不是实际的数组:
var odds = ["1", "3", "5"]
var evens = ["2", "4", "6"]
var source = odds
var destination = evens
var one = odds.first!
source.removeFirst() // only removes the first element of the `source` array, not the `odds` array
destination.append(one)
当我们查看odds和evens数组时,它们没有改变,因为我们更改了source和destination数组.
我知道我可以inout在函数上使用参数属性来通过引用而不是通过值传递它们:
func move(inout source: [String], inout destination: [String], value:String) {
    source.removeAtIndex(source.indexOf(value)!)
    destination.append(value)
}
move(&odds, destination: &evens, value:one)
有没有办法通过引用而不是按值将这些数组分配给变量?
在Swift中,将数组分配给新变量实际上是复制.例如(如在Apple doc for Array中):
var numbers = [1, 2, 3, 4, 5]
var numbersCopy = numbers
numbers[0] = 100
print(numbers)
// Prints "[100, 2, 3, 4, 5]"
print(numbersCopy)
// Prints "[1, 2, 3, 4, 5]"
我如何实际获得指向同一数组的指针,因此修改元素会反映在同一个数组中?(原因是我在另一个类的静态实例中访问,例如"SomethingManager.sharedInstance.arrayList [aKey]",我想将它缩短为指定的指针变量.)
(我很想知道如何在Swift 4和5中执行此操作.我没有看到Swift语言存在任何问题.)
编辑:
我提供了我需要有一个指针而不是副本的理由.
说,我有以下代码:
var childrenTasks = [Int64: [TaskRef]]()
在类中定义,可以访问:
MyClass.singleton.parentTask[parentTaskID].childrenTask[taskRefID]
正如您所看到的,访问childrenTask的代码非常长.我想要一个指针,只是一个例子: -
var aPointerToChildrenTasks = MyClass.singleton.parentTask[parentTaskID].childrenTask[taskRefID] // I want a pointer, not a copy!
aPointerToChildrenTask.remove(at: anIndex) // if it is a pointer, I can manipulate the …对不起,新手问题;我还在学习。我遇到了一些奇怪的行为,找不到任何关于此的文档。我想知道您是否可以帮助指出我在这里做错了什么。
错误:
不能对不可变值使用变异成员:“arr”是“let”常量
class mySingleton {
    static let sharedInstance = mySingleton()
    private init() {}
    var men = ["bob", "doug"]
    var women = ["alice", "lisa"]
    func removeFirst() {
        self.arr.removeFirst()
    }
    func removeFirstByGender(gender: String) {
        if gender == "men" {
              self.modify(arr: self.men) // <-- error occurs here.
        } else {
              self.modify(arr: self.women) // <-- error occurs here.
        }
    }
    func modify(arr: [String]) {
        arr.removeFirst()
    }
}
我可能错过了关于swift的重要信息.我有一个包含键/快速数组对的映射.我更改了数组,地图中的数组没有改变.有人可以解释发生了什么吗?谢谢!
var map = [String:[String]]()
var list = [String]()
map["list"] = list //output: "["list": []]\n"
print(map)
list.append("test")
print(list)  //output: "["test"]\n"
print(map)   //output: "["list": []]\n"
是否可以让struct表现得像一个对象.铁:
var arr = [1]
let arr1 = arr 
arr.append(1)
我想让arr1和arr一样.包装成对象是唯一的选择吗?