2014-12-06 43 views
-1

我有一個很容易被誤解的問題。簡單澄清對象Swift語言

我有兩個UIViews「A」和「B」。如果我寫:

let A = UIView() // Or something else 
let B = A 

,然後我改變B的性質(爲例幀)中,A的變化也將屬性?

我雖然沒有,但我是一個視圖的動畫,所以我有初始視圖和最終視圖。我創建了這樣一個過渡視圖:

let transitionView = finalView 

然後我改變了transitionView的屬性,一個標籤的位置爲例。

當我在動畫結尾處添加最終視圖時,標籤位於新位置。

爲什麼?謝謝

+1

這是Swift的一個令人難以置信的基本特徵。請在使用這種問題的帶寬之前嘗試查閱文檔。 – matt 2014-12-06 19:55:02

+0

這個問題似乎是無關緊要的,因爲它甚至不試圖查閱文檔。 – matt 2014-12-06 19:55:28

回答

2

在迅速的類型分爲2個大類:

  • 引用類型
  • 值類型

類是參考類型;結構體(包括數組和字典),基本數據類型(int,float,string等)和枚舉都是值類型。

值類型總是按值傳遞,這意味着當賦值給變量或傳遞給函數/方法時,會創建原始數據的副本。此規則有一個例外:函數/方法可以對值類型參數使用inout修飾符,以使其通過引用傳遞。

請注意,編譯器和運行時通常會進行優化,因此除非嚴格需要才能創建副本 - 重要的是我們作爲開發人員知道我們正在處理副本而不是原始數據。

引用類型總是通過引用傳遞,這意味着將其分配給變量或將其傳遞給函數/方法時,將分配/傳遞對數據的引用而不是數據本身。

UIView是一個類,因此當您創建一個實例時,將其分配給一個變量,然後將該變量分配給另一個變量,則分配該實例的引用而不是實例本身。兩個變量都指向相同的UIView實例。對實例所做的任何更改都對引用該實例的所有變量都可見。

建議閱讀:Classes and Structures

+0

好的,謝謝,我意識到我不瞭解所有這些......那麼我怎樣才能複製一個視圖呢?我怎麼能有第二個觀點,我可以修改而不修改第一個? – Coconuts 2014-12-06 20:32:34

+0

只需創建另一個實例 - 而不是'let b = a','let b = UIView()'。如果你真的想要一個'a'的副本,只需谷歌的'創建副本UIView' - 也許[這個答案](http://stackoverflow.com/a/13756101/148357)做這項工作,但從來沒有嘗試過。 – Antonio 2014-12-06 20:40:09

+1

@Coconuts如果你對這個問題的答案有了一個新的問題,請提出一個新的問題!另外,如果您已獲得答案的幫助,請考慮接受它(複選標記)。 – matt 2014-12-06 21:44:11

2

因爲B和A都是而不是兩種看法。它們是對同一個UIView對象的引用。

這又是因爲類實例在Swift中作爲引用類型傳遞。

現在不到我的小作文關於這一主題在這裏:https://stackoverflow.com/a/27366050/341994

+0

我應該在文檔中搜索什麼?不要批評,你能告訴我幾句話,我可以搜索嗎? – Coconuts 2014-12-06 20:09:28

+0

這是一個_class_的實例。閱讀關於_classes_的Swift文檔頁面。 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html#//apple_ref/doc/uid/TP40014097-CH13-XID_145特別關注這個問題,在這個地方它用大寫字母表示:**類是引用類型**。 – matt 2014-12-06 20:16:18

+0

@Coconuts歡迎來到Stack Overflow!如果你把事情少一些,你會更喜歡在這裏。這個答案沒有批評。這只是你問的問題的答案! – matt 2014-12-06 21:45:14