Arrays 将数组中的所有项复制到引用类型的新数组中的函数

Arrays 将数组中的所有项复制到引用类型的新数组中的函数,arrays,swift,types,copy,map-function,Arrays,Swift,Types,Copy,Map Function,创建数组并向其中添加一些对象引用类型时: let myArray = [UILabel(), UIButton(), UIView()] 我可以通过复制阵列的所有项来创建阵列的副本: 当我修改MyCopy Darray中的任何项目时,它不会对原始myArray产生任何影响 由于map:函数总是有点难以理解,我想将此复制操作包装成一个单独的函数,并使用一个更具表现力的名称: extension Array where Element: AnyObject { /// Creates a

创建数组并向其中添加一些对象引用类型时:

let myArray = [UILabel(), UIButton(), UIView()]
我可以通过复制阵列的所有项来创建阵列的副本:

当我修改MyCopy Darray中的任何项目时,它不会对原始myArray产生任何影响

由于map:函数总是有点难以理解,我想将此复制操作包装成一个单独的函数,并使用一个更具表现力的名称:

extension Array where Element: AnyObject {
    /// Creates a new array that contains a copy of each of the receiver's items.   
    func newArrayByCopyingItems() -> Array {
        return map{ $0.copy() }
    }
}
这不会影响工作,编译器也不会帮助我理解我做错了什么:

无法将类型为“\u->”的值转换为所需的参数类型“\u->”

有没有人能给我一个更有用的建议

我怀疑编译器无法推断参数$0的类型AnyObject,尽管它是在扩展声明中显式定义的。

AnyObject没有为它声明copy方法

我会解释一下我用来给出答案的步骤。也许这会有帮助

从:let copiedaray=myArray.map{$0.copy}开始

我首先查找一个声明了copy方法的协议,但没有找到。我在该方法中发现的最通用的类是NSObject,所以看起来我不得不使用它。然后,我通过单击选项查看copiedArray的类型。我发现它是一个[任何]。这意味着我最终会:

extension Array where Element: NSObject {
    func newArrayByCopyingItems() -> [Any] {
        return self.map { $0.copy() }
    }
}
不是很愉快,但事实就是这样。我可以通过创建自己的协议使它更有用。这样做的好处是我可以保持复制的数组的类型。不利的一面是,我必须确保我要使用的所有类型都符合扩展

使用下面的代码,我现在可以执行以下操作:

let myArray = [UILabel(), UIButton(), UIView()]
let myCopiedArray = myArray.newArrayByCopyingItems()
myCopiedArray将是一个UIView数组,而无需我投射它们

protocol Copying {
    associatedtype Copied
    func makeCopy() -> Copied
}

extension Array where Element: Copying, Element.Copied == Element {
    func newArrayByCopyingItems() -> [Element] {
        return self.map { $0.makeCopy() }
    }
}

extension UIView: Copying {
    func makeCopy() -> UIView {
        return self.copy() as! Copied
    }
}

谢谢你的回答,很抱歉回复太晚。我的主要问题是我用NSObject交换了AnyObject。后者有复制功能,前者没有。就我个人而言,我不会使用这个协议,因为它创建了另一个非标准的复制函数,这使得它很容易被混淆。
protocol Copying {
    associatedtype Copied
    func makeCopy() -> Copied
}

extension Array where Element: Copying, Element.Copied == Element {
    func newArrayByCopyingItems() -> [Element] {
        return self.map { $0.makeCopy() }
    }
}

extension UIView: Copying {
    func makeCopy() -> UIView {
        return self.copy() as! Copied
    }
}