Swift 类型的immutable仅具有变异成员

Swift 类型的immutable仅具有变异成员,swift,Swift,下面的代码抛出错误“类型为[User]的不可变值只有名为append的变异成员”,请告知 库或框架代码(预编译) 库或框架代码的用户 class User { var first: String var last: String init(first: String, last:String) { self.first = first self.last = last } } class Test: Database {

下面的代码抛出错误“类型为[User]的不可变值只有名为append的变异成员”,请告知

库或框架代码(预编译)

库或框架代码的用户

class User {
    var first: String
    var last: String

    init(first: String, last:String) {
        self.first = first
        self.last = last
    }
}

class Test: Database {

    init() {
        super.init(data: [User]())
    }

    func addItem(item: User) { //edit User type from Any but problem persists
        (self.data as! [User]).append(item) //error
    }
}
尝试1,这似乎可以工作,但仍然想知道为什么上面的代码不能工作

func addItem(item: User) {
    var users = self.data as! [User]
    users.append(item);
    self.data = users; 
} 
我不喜欢重新分配,如何才能实现原地可变

我已经为这个问题写了一个(我认为是)优雅的解决方案

class User {
    var first: String
    var last: String

    init(first: String, last:String) {
        self.first = first
        self.last = last
    }
}

class Test: Database {

    init() {
        super.init(data: [User]())
    }

    func addItem(item: User) { //edit User type from Any but problem persists
        (self.data as! [User]).append(item) //error
    }
}
public struct Accessor<T, U>
{
    public let (getter: (T -> U), setter: (U -> T))

    public init()
    {
        (getter, setter) = ({ $0 as! U }, { $0 as! T })
    }

    public init(_ getter: (T -> U), _ setter: (U -> T))
    {
        self.getter = getter
        self.setter = setter
    }
}

extension Accessor: NilLiteralConvertible
{
    public init(nilLiteral: ())
    {
        self.init()
    }
}

public class Mediator<T, U>
{
    public var rawValue: UnsafeMutablePointer<T>
    public var accessor: Accessor<T, U>

    public init(_ rawValue: UnsafeMutablePointer<T>, _ accessor: Accessor<T, U> = nil)
    {
        self.rawValue = rawValue
        self.accessor = Accessor<T, U>({ $0 as! U }, { $0 as! T })
    }

    public var value: U
    {
        get
        {
            return accessor.getter(rawValue.memory)
        }

        set
        {
            rawValue.memory = accessor.setter(newValue)
        }
    }
}
公共结构访问器
{
公共let(getter:(T->U),setter:(U->T))
公共init()
{
(getter,setter)=({$0as!U},{$0as!T})
}
公共初始化(U-getter:(T->U),uu-setter:(U->T))
{
self.getter=getter
self.setter=setter
}
}
扩展访问器:NilLiteralConvertible
{
公共init(nilLiteral:())
{
self.init()
}
}
公共类调解人
{
public var rawValue:UnsafeMutablePointer
公共变量访问器:访问器
public init(uvalue:UnsafeMutablePointer,accessor:accessor=nil)
{
self.rawValue=rawValue
self.accessor=accessor({$0as!U},{$0as!T})
}
公共var值:U
{
得到
{
return accessor.getter(rawValue.memory)
}
设置
{
rawValue.memory=accessor.setter(newValue)
}
}
}
允许:

Mediator<Any?, [User]>(&self.data).value.append(item)
Mediator(&self.data).value.append(项)

问题是您试图在
User
数组中添加类型为
Any
的对象,尝试使用
item作为User
仍然存在相同的问题,我在游乐场中有两段代码(库+我的代码)用于测试数据类型为Any。这不是一个数组。所以你不能使用append。@ThomasKilian我已经为
数据提供了
[User]()
,而且
addItem
中有一个强制力,任何更改库代码的建议(它必须是泛型的,应该包含所有类型的变量)我感谢你的尝试,但是对于这个任务来说,它太高级或太复杂了,我需要一个简单的解决方案。您的尝试是最简单的。为了理解,请解释为什么上面的代码对我不起作用。当您强制转换为值类型时,结果总是不变的。