Swift 2.0通过值传递

Swift 2.0通过值传递

问题描述:

我刚刚进入Swift中的结构,并且我有一个非常基本的问题,我在其他地方找不到答案。如果你定义一个函数返回一个结构的新实例,那么会创建多少个实际对象?Swift 2.0通过值传递

在下面的例子,CGRectMake构造一个结构实例和它返回到该功能,那么调用者接收另一副本。这是否意味着下面这行代码会创建3个结构实例并立即丢弃2?

客户

var rect = makeNormalFacetTextRect(); 

API

class func makeNormalFacetTextRect() -> CGRect { 
    return CGRectMake(new_x, new_y, new_width, new_height); 
} 

而且,如果我建我的方法就这样,我经常为debuggin做克,是否引入了另一个副本(总计4)?

class func makeNormalFacetTextRect() -> CGRect { 
    var newRect = CGRectMake(new_x, new_y, new_width, new_height); 

    return newRect; 
} 

从苹果公司的documentation

结构和枚举是值类型

值类型是一种类型,它的值时,它被分配到一个 变量或常量,或者当它传递被复制到一个功能。

在我看来,这意味着

class func makeNormalFacetTextRect() -> CGRect { 
    var newRect = CGRectMake(new_x, new_y, new_width, new_height); 

    return newRect; 
} 

将创建2层结构。当newRect被初始化时将会创建一个。

var rect = makeNormalFacetTextRect(); 

原代码是更有趣:当您复制newRect到您的变量第二个将创建

class func makeNormalFacetTextRect() -> CGRect { 
    return CGRectMake(new_x, new_y, new_width, new_height); 
} 

当你调用

var rect = makeNormalFacetTextRect(); 

1或2层结构将被创建。我倾向于认为,1将被创建,因为我认为斯威夫特优化不够好,翻译上面的代码为:

var rect = CGRectMake(new_x, new_y, new_width, new_height) 

而且,它在文档提到,斯威夫特优化某些值类型,如字符串的复制,字典等。在我看来,这也意味着Structs的复制也将得到优化。

在任何情况下,上述两种代码不能产生多于2层结构的每个

+0

我认为优化(在发布版本中)应该跳过未使用的var'newRect'并返回值而不产生额外的副本。 – kostek

+0

@kostek最有可能的是。但是,对于调试代码,它也取决于稍后发生的情况。例如,如果添加了一些print()(或其他操作),则可能会导致创建2个实例。尽管我同意Swift中的优化是非常好的,但Apple表示我们不应该关心值类型的额外分配 –

+0

感谢您的详细解释。 – absmiths

Swift documentation

在你的代码中看到的行为将永远是仿佛复制了地方。但是,当绝对必要时,Swift仅在幕后执行实际的副本。 Swift管理所有值复制以确保最佳性能,并且您不应该避免分配尝试抢占此优化。

我认为这会回答你的问题。

+1

即评论,具体讲'String','Array'和'Dictionary'这对写入执行的副本。对于Swift中的每个结构,这都是不正确的。 – Lance

+0

@Lance,我宁愿说,从文档中可以看出字符串,数组和字典都是作为结构_实现的,因此其行为与结构相似,其中一部分是写入时的复制。任何其他行为,如果不是一个错误,我会把它归类为一个严重的缺陷,因为它会使Swift的整个传递价值信仰无效。 – courteouselk