如何使用值类型对象作为引用类型?

时间:2017-01-24 16:33:22

标签: swift

在我的模型中,我有一些数组:

var thisArray = [Object]
var thatArray = [Object]
var anotherArray = [Object]

在我的视图控制器中,我想打开一个值来确定我将追加到哪个数组:

var whichArray: [Object]!
switch someValue {
    case .thisArray: whichArray = thisArray
    case .thatArray: whichArray = thatArray // "He went thatArray!"
    case .anotherArray: whichArray = anotherArray
}
whichArray.append(object)

但当然这不起作用,因为Array是一种值类型。

有办法做到这一点吗?当然,我可以做到以下几点:

switch someValue {
    case .thisArray: thisArray.append(object)
    case .thatArray: thatArray.append(object)
    case .anotherArray: anotherArray.append(object)
}

但那是不那么优雅和多余的!如果周围的代码中还有其他更复杂的事情发生,那么尤其如此。

这里有解决方案吗?是否可以创建对值类型的引用?

PS。更好的是,虽然真的是它自己的问题,但是如果我可以使用案例的名称(例如,“{1}}的”thisArray“来按名称设置数组(即,避免整个switch语句只是说someValue = .thisArray或类似的东西)但据我所知这不是一件事。或许这可能吗?也许这是我的生日?

3 个答案:

答案 0 :(得分:2)

由于Arrays值类型 - 正如您自己所说 - 它们不能作为参考传递(或分配)。一种解决方案是为Array创建一个包装类,它本身就是引用类型。然后,您可以分配此包装类而不是数组本身。

现在,鉴于您还说您可能更愿意通过名称访问Arrays并完全摆脱switch,您可以将设计更改为存储thisArray,{{ 1 {}和thatArray中的anotherArray,其中键是Dictionary的不同值。

这样你就可以简单地追加到所需的数组:

someValue

(假设你事先正确设置了字典)

就像这样:

arrayDict[someValue]?.append(object)

为了创建一个简短的工作示例,我已将enum Value { case thisArray case thatArray case anotherArray } var arrayDict = [ Value.thisArray : [String](), Value.thatArray : [String](), Value.anotherArray : [String]() ] arrayDict[.thatArray]?.append("Some String.") 替换为Object,但这显然无关紧要。

答案 1 :(得分:1)

尽管Swift旨在减少指针操作,但仍然可以使用指针:

String

对此的一个小麻烦是你必须调用var thisArray = [1,2,3] var thatArray = [4,5,6] var anotherArray = [7,8,9] var ptr: UnsafeMutablePointer<[Int]> let someValue = 2 switch someValue { case 1: ptr = UnsafeMutablePointer(&thisArray) case 2: ptr = UnsafeMutablePointer(&thatArray) default: ptr = UnsafeMutablePointer(&anotherArray) } ptr.pointee.append(42) print(thatArray) // [4,5,6,42] 来访问目标数组。如果将指针对象分配给另一个变量(即ptr.pointee),则对let whichArray = ptr.pointee的任何修改都不会反映在原始数组中。

(我必须将whichArray类型更改为Object,以便它在IBM Swift Sandbox中运行

答案 2 :(得分:1)

我通常建议使用闭包来解决这个问题。它更强大,更安全。例如:

let append: (Object) -> Void

switch someValue {
case .thisArray: append = { thisArray.append($0) }
case .thatArray: append = { thatArray.append($0) }
case .anotherArray: append = { anotherArray.append($0) }
}

append(object)

(这里只是说append = thisArray.append是理想的,但你今天不能在Swift中做到这一点。它可以部分应用变异功能&#34;和这目前不合法。)