2015-10-05 68 views
0

我一直試圖擴展包含特定類型的swift數組。擴展包含特定元素類型的swift數組

protocol Node { 
    var nodeId: Int { get } 
    var parentId: Int? { get } 
    var children: [Node] { get set } 
    var level: Int { get set } 
} 

extension Array where Element : Node { 
/** 
unflatten an array of Nodes. 
*/ 
func unflattenNodes()-> [Node] { 

    func unflatten(inout parent: Node?)-> [Node] { 

     var topNodes = [Node]() 
     let children = self.filter{ (child: Node) in return child.parentId == parent?.nodeId ?? 0 } 

     if !children.isEmpty { 

      if var parent = parent { 
       for var child in children { 
        child.level = parent.level + 1 
       } 
       parent.children = children 
      } 
      else { 
       topNodes = children 
      } 

      for child in children { 
       var optChild = Optional(child) 
       unflatten(&optChild) 
      } 
     } 
     return topNodes; 
    } 

     var optChild: Node? = nil 
     return unflatten(&optChild) 
} 
} 

上面這段代碼不會被編譯,因爲「節點」不是「元素」的亞型,即使我延伸部件的「節點」的陣列。 如何將我想要在swift中執行的操作歸檔? 我想添加一個實例方法到[Node]來解除自我。

+0

你有沒有試過http://stackoverflow.com/questions/31806324/extend-array-types-using-where-clause-in-swift? – Paulw11

+0

我只是試過,它的工作。謝謝! – kazuochi

回答

1

的問題是,該協議Node不符合本身:NodeNode型沒有(因爲矛盾,因爲它的聲音),因爲協議不是一個具體類型,它只是在貼合型的要求。這就是說,你需要用你的代碼中的Node的每個實例替換爲Element,那麼它應該工作(現在不能測試它)。這是因爲再次,你實際上沒有處理Node類型的某些價值,而是符合NodeElement你的情況)的類型的值

而且你做你的代碼的一些其他錯誤,我我會把它留給其他人來糾正,因爲我沒時間了。

1

對,我已將代碼插入Playground,並發現三個問題。第一個是Kametrixom提到的那個,你需要使用Element作爲unflattenNodes中的任何地方。當你有固定的地方,擺脫在調用unflatten所有parent:,你會留下一個錯誤

parent.children = children 
error: cannot assign a value of type '[Element]' to a value of type '[Node]' 
       parent.children = children 
           ^

這是由在協議中children屬性定義爲[Node]造成的事實和斯威夫特不能匹配到的Element

數組所以你需要更改協議

protocol Node { 
    var nodeId: Int { get } 
    var parentId: Int? { get } 
    var children: [Self] { get set } 
    //   ^^^^^^ Here 
    var level: Int { get set } 
} 

children物業不再是一個陣列的Node但任何類型的陣列符合協議,你的情況,Element

1

更新extension Array where Element : Nodeextension CollectionType where Generator.Element == Node解決錯誤。

相關問題