2016-08-24 39 views
0

我想使列表< T>符合NSCopying。我不能因爲:不能使領域列表<T>符合NSCopying

  1. @objc在泛型類的擴展中不受支持。
  2. 我不能繼承列表,因爲它是一個最終的類。
  3. 如果我實現「公共func副本(帶區:NSZone?=無) - >任何」沒有標記符合NSCopying。我只是得到錯誤:「... copyWithZone:]:無法識別的選擇發送到實例」

所以雖然在名單< T>複製(),我們永遠無法真正使用它。

當前我必須使用迭代在列表< T>之外進行復制。我不能簡單地使用instanceOfList.copy()。

回答

1

沒有必要使List<T>符合NSCopying以便使用複製成員函數來擴展它,除非您嘗試在Objective-C的通用上下文中複製它。 NSCopying是一個傳統協議,在純Swift中使用並不合理。它是類綁定的,並沒有非常好的類型簽名。

如果您嘗試在純Swift的通用上下文中使用NSCopying,請考慮定義您自己的Copyable協議並將其擴展爲符合此類型。由於它不是@objc,你應該沒問題。已經符合NSCopying的現有類型將需要擴展以符合Copyable,但您可以將邏輯放在NSCopying的擴展名中。

import Foundation 

protocol Copyable { 
    mutating func copy() -> Self 
} 

extension NSCopying { 
    func copy() -> Self { 
     return copy(with: nil) as! Self 
    } 
} 

extension MyTypeThatConformsToNSCopying: Copyable { } 

現在,我有點好奇,爲什麼你可能會嘗試符合List<T>NSCopying。你在尋找一個不受管理的清單副本嗎?您可以使用Array(myList)List獲得Array

+0

是的。我正在嘗試製作一個不受管理的副本。我想首先實施NSCopying的原因很簡單。已經有一個從NSObject繼承的copy()。 –