2015-04-25 72 views
1

以下代碼拋出一個錯誤「不可變值的類型[用戶]只有變異成員名爲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; 
} 

不喜歡重新分配,如何在地方的可變性能夠

+0

的問題是,你正在嘗試,嘗試使用'項目作爲User' – tkanzakic

+0

還添加型Any'的'對象在User'的'數組有同樣的問題,我有兩塊代碼(庫+我的代碼)在操場上進行測試 – user2727195

+0

數據是Any類型的。這不是一個數組。所以你不能使用append。 –

回答

1

我寫了這一問題的(我認爲是)優雅的解決方案。

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) 
+0

我很欣賞你的嘗試,但對於這項任務來說,這太過先進或複雜,我需要一個簡單的解決方案 – user2727195

+0

你的嘗試是最簡單的。 –

+0

爲什麼上述代碼對我來說不起作用的原因的任何解釋 – user2727195

相關問題