我需要使用Swift返回一个对象的副本,但我无法弄清楚如何执行此操作。
我将如何在Objective-C中执行此操作:
-(NSArray*) doingSomethingwith
{
NSArray *myArray = @[@"a",@"b",@"c",@"d",];
return [myArray copy];
}
你们中的任何人都知道怎么做这个Swift?
我真的很感谢你的帮助。
答案 0 :(得分:3)
如果数组的内容是值对象,因为常量字符串在您的示例中,则只需返回它; Swift分配具有复制行为。这在Classes And Structures Apple文档的末尾进行了解释:
字符串,数组和字典的分配和复制行为
在Swift中,许多基本数据类型(如String,Array和Dictionary)都是作为结构实现的。这意味着字符串,数组和字典等数据在分配给新常量或变量时,或者传递给函数或方法时,都会被复制。
此行为与Foundation不同:NSString,NSArray和NSDictionary实现为类,而不是结构。 Foundation中的字符串,数组和字典始终作为对现有实例的引用进行分配和传递,而不是作为副本传递。
注意:上面的描述涉及字符串,数组和字典的“复制”。您在代码中看到的行为将始终如同副本一样。但是,当绝对必要时,Swift仅在幕后执行实际复制。 Swift管理所有值复制以确保最佳性能,您不应该避免分配以尝试抢占此优化。
如果你的数组包含引用对象,并且你想要返回它们的深层副本,那就有点棘手了; here's a discussion关于如何处理这个问题。虽然正确处理方法是重做代码以使用值类型。
答案 1 :(得分:1)
你可以这样做。
let myArray: NSArray = ["a","b","c","d"]
func returnCopyOfArray() -> NSArray{
return myArray
}
答案 2 :(得分:0)
好吧,你可以让对象符合NSCopying。
class Person: NSObject, NSCopying {
var firstName: String
var lastName: String
var age: Int
init(firstName: String, lastName: String, age: Int) {
self.firstName = firstName
self.lastName = lastName
self.age = age
}
func copy(with zone: NSZone? = nil) -> Any {
let copy = Person(firstName: firstName, lastName: lastName, age: age)
return copy
}
}
然后你可以在上面打电话给副本。
let clone = myPerson.copy()
如果您没有实现该类,那么如果该类具有public
或open
访问权限,则可以扩展该类。
extension Person: NSCopying {
func copy(with zone: NSZone? = nil) -> Any {
let copy = Person(firstName: firstName, lastName: lastName, age: age)
return copy
}
}
答案 3 :(得分:-1)
Swift没有参考。所以,你可以直接返回数组。