swift - 不可变类型只有可变成员

标签 swift

以下代码抛出错误“[User] 类型的不可变值仅具有名为 append 的可变成员”,请指教。

库或框架代码(预编译)

class Database {
    var data: Any? //can change this code but has to be a generic placeholder

    init(data: Any?=nil) {
        self.data = data
    }
}

库或框架代码的用户

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; 
} 

不喜欢重新赋值,怎么可能就地可变

最佳答案

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

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)
        }
    }
}

允许:

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

关于swift - 不可变类型只有可变成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29871259/

相关文章:

ios - 如何找到 UInt64 之间的随机数? ( swift )

ios - 应用程序在后台时本地通知声音不播放 - Swift

swift - 向 UIBarButtonItem Swift 添加操作

ios - 如何在 Xcode 中调试 EXC_BREAKPOINT (SIGTRAP)

swift - 如何在 Firebase 上每天重置数据?

swift - 如何在 Swift 4 中访问另一个结构内的结构值?

swift - 扫描特定 CBUUID IOS 时,核心蓝牙找不到外围设备(前台和后台)

ios - 类方法访问级别默认为 internal

swift - 在 Swift 3 中使用 KVO 检查值是否被更改

swift - 如何设置 Cocoa 应用程序标题栏的样式?