Swift制作传递的类实例的副本

时间:2017-07-26 00:40:43

标签: swift swift3 pass-by-reference

我有一个init,它接受一个类的实例(我希望每个人都知道这意味着它是通过引用传递的)

我希望能够复制对象并存储在两个类实例变量中,这样,我有一个函数可以充当“重置”,它将设置我所做的任何更改某一点可以追溯到以前的样子。

如下所示:

convenience init(_ item:Item?){
    self.init()
    self.item = item
    self.undoItem = item
}


func reset(){
    self.item = self.undoItem
    self.reloadInfo()
}

对于应该是一个相对简单的解决方案,我没有取得多大成功。我对Swift和iOS开发太新了。

2 个答案:

答案 0 :(得分:0)

使用快速结构可能是您的选择。

struct Item {
    //
}

Swift中的结构是值类型,它们是按值而不是引用复制的。

示例

struct Item {
    var value: Int = 1
}

var item1 = Item()
var item2 = item1
item2.value = 20

print("\(item1.value)") // 1
print("\(item2.value)") // 20

在上面的示例中,item1.value1item2.value20。 以下行创建item1的副本并将其分配给item2:

var item2 = item1

从这一行开始,item2的任何更改都不会反映在item1中。

结论

Item定义为struct

可以解决您的问题

答案 1 :(得分:0)

在操场上写下以下内容(在朋友的帮助下):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>Overflow Flex Box Issue</title>
<style type="text/css">
* {border: 0; margin: 0; padding: 0;}

aside
{
 background-color: #afa;
 order: 2;
 width: 20%;
}

body
{
 display: flex;
 flex-direction: column;
 height: 100%;
}

body > header
{
 align-self: stretch;
 background-color: #faa;
 flex: 0 1 auto;
 min-height: 56px;
 order: 1;
}

body > footer
{
 align-self: auto;
 background-color: #aaf;
 flex: 0 1 auto;
 min-height: 36px;
 order: 2;
}

html {height: 100%;}

main
{
 background-color: #cfc;
 order: 1;
 width: 80%;
}

#body
{
 display: flex;
 order: 2;
 overflow: auto;
}

</style>
</head>

<body>

<div id="body">
<main>
<article>
<p>article</p>
<p>article</p>
<p>article</p>
<div style="height: 10000px;">10,000px</div>
</article>
</main>
<aside><p>&#60;aside&#62;, 100% height only of visible area, it <em>should</em> be <em>100% of total parent height</em>.</p></aside>
</div>

<header>The body &#62; header element; element 2, order: 1;.</header>
<footer>The body &#62; footer element; element 3, order: 3;.</footer>

</body>
</html>

这是一个很好的简单函数,因此我可以在swift中获取我的类实例的副本。在swift中,因为它们是引用类型(我不确定你是否可以取消引用它或诸如此类),你基本上每次都必须为你的对象编写一个自定义复制函数。好吧,现在我写了这个,所以只要你使用NSObject的子类并使用这个协议,你就可以了。

这完全符合我的代码