设置变量等于视图的框架,而视图的框架更改时该值不变

时间:2019-08-01 01:32:57

标签: ios swift variables swift4 cgrect

我想知道更改帧之前的原始值。为此,我想到了这一点:

var baseViewOriginalFrame: CGRect!

func changeFrame() {
   baseViewOriginalFrame = boxView.frame
   boxView.transform = CGAffineTransform.identity.translatedBy(x: 0, y: +5)
}

我注意到原始帧实际上是boxView的当前帧,因此我读了Setting a variable equal to another variable,并了解到originalFrame变量仅存储对象的位置。

那我该如何做到这一点(保存boxView的原始框架)?

1 个答案:

答案 0 :(得分:1)

这归结为引用类型和 value 类型之间的区别。

在Swift中,当您拥有一个值类型的变量(链接整数,字符串等)时,该变量将保留该值。当您拥有引用类型(例如Class)的变量时,它将在内存中保存对该对象的引用

这意味着,当您传递一个值类型变量时,您将传递该变量所保存的实际数据。但是,当传递引用类型变量时,就是传递对该对象的引用。

采用以下代码段,您可以看到,当您为值类型创建副本时,会获得该副本的实际副本。复制引用类型时,仅会获得另一个对内存中相同对象的引用,这意味着任何更改都会反映在另一个变量中,因为它们都引用相同的对象。

// Structs are a VALUE type
struct myStruct {
    var value: Int

    init(x: Int) {
        self.value = x
    }
}

// Classes are a REFERENCE type
class myClass {
    var value: Int

    init(x: Int) {
        self.value = x
    }
}

var a = myStruct(x: 5)
var originalA = a       // This has made a copy of a, and stores it in originalA
a.value = 100

print(originalA.value)
print(a.value)

var b = myClass(x: 5)
var originalB = b       // This is still referencing the same object as the variable b.
b.value = 100

print(originalB.value)
print(b.value)

现在,对于您的特定示例,我对为什么它不起作用感到困惑,因为从我的角度来看,CGRect是一种结构,这是一种值类型,因此按您的方式进行复制应该可以正常工作。实际上,我只是将您所拥有的代码添加到了我的一个应用程序中方法的末尾,它的工作原理完全符合您的期望:

let x = textView.frame
textView.transform = CGAffineTransform.identity.translatedBy(x: 0, y: +5)
print(x)   // Prints (16.0, *83.0*, 343.0, 564.0)
print(textView.frame) // Prints (16.0, *88.0*, 343.0, 564.0)

希望这会有所帮助, 雅各布。