我在Swift中遇到了数组问题。问题在于它是Swift中的值类型。我正在尝试找到解决方法。 这是我的代码:
class Object: Codable{
var name : String?
}
var objects: Array<Object>?
objects = Array<Object>()
if var obj = objects { // <----- Creates a copy of array here
let o = Object()
o.name = "1"
objects?.append(o)
print(obj) //<----- this one is missing "o" object
print(objects)
}
我不能使用NSMutableArray
,因为我在另一个可编码类中有一个数组。
每个人对此有何经验?如果有人可以为此提供解决方案。
答案 0 :(得分:0)
习惯作为值类型的数组并不是很困难。如果我是您,我的代码版本将如下所示
var objects: Array<Object>?
objects = Array<Object>()
if var unwrappedObjs = objects {
let o = Object()
o.name = "1"
unwrappedObjs.append(o)
objects = unwrappedObjs
}
或者也许是这样:
var objects: Array<Object>?
objects = Array<Object>()
if objects != nil {
let o = Object()
o.name = "1"
objects?.append(o)
}
最后,您始终可以尝试制作自己的“ ReferenceArray”类,该类包装数组API并为您提供引用语义,但这似乎有点过头了。很快就应该自然而然地将数组作为值类型了。
答案 1 :(得分:0)
bitwit已经提到了这一点,但是我认为您最大的错误就是根本不接受新对象作为源。除非保留$shiftings = Shifting::with('users')->get();
dd($shiftings);
很重要,否则应将其替换为Array<Object>?
。
Array<Object>
如果需要在同一范围内,请使用var objects: Array<Object>?
objects = Array<Object>()
if var objects = objects { // <----- Creates a copy of array here
let o = Object()
o.name = "1"
objects.append(o) // objects is now the non-optional one
print(objects)
}
:
guard
如果您绝对需要引用数组,则可以创建一个容器类:
var objects: Array<Object>?
objects = Array<Object>()
guard var objects = objects else { // <----- Creates a copy of array here
fatalError()
}
let o = Object()
o.name = "1"
objects.append(o) // objects is now the non-optional one
print(objects)