NSCopying副本(带:) - 是否真的需要返回Any?

时间:2017-04-28 04:47:43

标签: swift nscopying

如果返回的对象属于Any类型,有没有办法使用NSCopying?它总是迫使我施展。这看起来很奇怪。我正在复制该对象,不应该根据复制这个词的定义,Swift知道它的类型相同吗?

有没有其他方法可以复制我不了解的对象,或者是否有一些"陷阱"我错过了需要这个。

课程非常简单,如:

class Person {
   var name: String
   var age: Int
}

它必须是一个类,因为我需要继承。

示例:

var john = Person(name: "John", age: 30)
var johnsClone = john.copy() as! Person

我想我可以创建一个带有现有对象的初始化器,但这似乎在语义上不如单词" copy"。

init(person: Person) {
     return Person(name: person.name. age: person.age)
}

我实现自己的clone()方法的唯一问题是我还希望有一个协议可以在许多这样的对象上调用clone()并隐式返回相同的对象类型。 / p>

3 个答案:

答案 0 :(得分:5)

这是NSObject方法copy的{​​{3}}:

- (id)copy;

转换为Swift为:

func copy() -> Any

因此,没有类型信息附加到新对象;这就是你必须施展的原因。

现在,如果您不喜欢这样,那么在您的情况下可以轻松解决:不采用NSCopying并且不使用内置的NSObject {{1} } 方法!编写自己的克隆人的一次性方法 - 例如一个名为copy的实例方法。 NSObject makeClone()是一种方便,但没有法律要求你使用它(除非有Objective-C API为什么Person需要符合NSCopying,例如它将被用作NSDictionary的关键,但我和#39;打赌你永远不会遇到任何这样的理由。)

答案 1 :(得分:2)

copy(with:)是Objective C方法的-copyWithZone的Swift导入版本。在制定本协议时,目标C没有表达copyWithZone应该返回与其self相同类型的机制。引入instancetype是为了能够做到这一点,但NSCopying早于instancetype的存在。将其从id切换为instancetype将是一个重大变化,因此它从未完成。

答案 2 :(得分:0)

根据我上面收到的信息和此帖Protocol func returning Self,这是一种不使用NSCopying的方法。

由于自定义copy()会返回对象的类型,而NSCopying的{​​{1}}会返回copy(),因此两者有不同的方法签名,因此您可以使用拥有Any而没有含糊不清。

copy()