Swift:返回一个对象的副本

时间:2016-05-19 15:48:19

标签: swift nsarray

我需要使用Swift返回一个对象的副本,但我无法弄清楚如何执行此操作。

我将如何在Objective-C中执行此操作:

-(NSArray*) doingSomethingwith
{
    NSArray *myArray = @[@"a",@"b",@"c",@"d",];

    return [myArray copy];
}

你们中的任何人都知道怎么做这个Swift?

我真的很感谢你的帮助。

4 个答案:

答案 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()

如果您没有实现该类,那么如果该类具有publicopen访问权限,则可以扩展该类。

extension Person: NSCopying {
  func copy(with zone: NSZone? = nil) -> Any {
    let copy = Person(firstName: firstName, lastName: lastName, age: age)
    return copy
 }
}

答案 3 :(得分:-1)

Swift没有参考。所以,你可以直接返回数组。