2015-04-03 66 views
0

我想更好地掌握self的使用。使用self基本上只是輸入類名的一個快捷方式?例如,在下面的代碼中,如果我使用self它是否指代Tank2類?例如,它基本上是輸入Tank2.bonusDamage的捷徑嗎?我不明白自己所指的是什麼「當前實例」。我什麼時候使用自己的財產?

我不太理解它,因爲我注意到,例如,這兩個頂部的代碼片段返回完全相同的東西。

//SNIPPET 1: 
    var damage: Double { 
    return baseDamage + Tank2.bonusDamage 
} 

    //SNIPPET 2: 
    var damage: Double { 
    return self.baseDamage + Tank2.bonusDamage 

} 

class Tank2 { 
class var bonusDamage: Double { 
    return Double(Upgrade.level) * 2.5 
} 

let baseDamage = 10.0 

var damage: Double { 
    return baseDamage + Tank2.bonusDamage 
} 

class func upgrade() { 
    Upgrade.level += 1 

} 

struct Upgrade{ 
static var level = 0 
} 
} 
+0

'self'用於在界面中使用'@property annotation'調用類的定義屬性,但是您也可以通過添加'_'前綴來訪問該屬性,或者,如果它的靜態屬性可以訪問它通過Classname而不是'self'。除此之外,任何聲明的事物都可以在沒有自我的情況下被訪問。如果你將你的財產綜合到課堂上,那麼你不需要'self'來訪問它。 – iphonic 2015-04-03 05:16:56

回答

1

類定義描述描述其大小,座位等數量的屬性和就像汽車的計劃類的方法 - 但你不能開車的計劃,你需要的實際實例從這些計劃建造的汽車。

與對象類類似 - 您需要一個類的實際實例來操作。

給出一個簡單的汽車類 -

Class Car 
    property color:Color 
    property fuelTankLevel:Integer 
    propert (readOnly) capacity:Integer = 60 // Fuel tank capacity in litres 

請注意,這不是斯威夫特或Objective C,只是一類的簡化版本。

我可以存儲在實例變量 -

let redCar=Car(color:Red) 
let blueCar=Car(color:Blue) 

這是罰款,我的計劃之內從指那些車,但對於汽車的方法,讓我填油箱。從我的程序中,我可以說blueCar.fill() - 但在fill方法中,我需要在正確的坦克上操作。 fill內部我不能參考blueCarredCar,因爲這些只是類定義之外的實例。這是self用武之地。

self表示「當前對象實例」,所以fill方法可以

fill() { 
    self.fuelTankLevel=self.capacity 
} 

所以,當這個代碼是的對象實例調用self將是實例。所以當我說blueCar.fill()時,執行的代碼實際上是blueCar.fuelTankLevel=blueCar.capacity

在斯威夫特可以省略self和Objective-C中,你可以使用_fuelTank(或任何後盾變量,你@synthesized)直接訪問屬性後盾變量,但它是一個好主意,進入使用self的習慣因爲它清楚地表明你正在訪問一個屬性而不是本地或全局變量。同樣在Objective-C中,它確保調用任何setter/getter方法。

您可以定義類方法 - 這些方法不能在任何特定實例上運行。在Objective-C,你經常看到包裹兩階段分配/「構造」類方法初始化成一個類方法,因此不要說:

Car *redCar=[[Car alloc]initWithColor:red]; 

你可以說

Car *redCar=[Car carWithColor:red]; 
+0

@ Paulw11 - 謝謝你的回答,但我還是不明白。在我給出的例子中,在這種情況下使用'self'是什麼引用? 'var damage:Double {self.baseDamage + Tank2.bonusDamage}' - 另外,在你給出的例子中,當你在'fill'方法中使用self時,當前對象實例是什麼?它是'fill()'嗎?你基本上說'fill.fuelTankLevel = fill.capacity'嗎? – Michael 2015-04-03 13:54:07

+0

我更新了我的答案,以解釋在實例上調用「fill」時會發生什麼。在你的情況下,你正在將一個實例方法(對特定實例進行操作的代碼)與一個類方法相結合 - 對該類進行調用的代碼。所有坦克的'bonusDamage'數量是相同的,但特殊坦克實例的baseDamage可以在坦克初始化時更改 – Paulw11 2015-04-03 21:20:41

0

沒有self與輸入類名稱不同。

self是當前課程的一個對象。因此,該類中可用的所有屬性和函數值都可以使用self進行引用。

但是,有些函數(稱爲類函數並與+區分開),它們不依賴於類對象。這些類函數是通過類名稱調用的。 例

Class TestClass 
+ (int)addToFive:(int)input 
{ 
    return input+5; 
} 

調用此方法[TestClass的addToFive:10]會返回15

Class TestClass 
@property int counter; 

-(int)addToCounter:(int)input 
{ 
    // self.counter corresponds to counter value for self (this particular TestClass object) 
    return self.counter + input; 
} 

// call this method 
TestClass *classObject = [TestClass alloc] init]; 
classObject.counter = 10; 
[classObject addToCounter:10] // will return 20. 

我希望這可以幫助你。

0

在類代碼中 - 例如類方法,靜態方法或類屬性的初始化程序 - self表示「此類,無論它是什麼」。

實例代碼 - 例如實例方法或實例屬性的初始化程序 - self表示「此實例,無論它是什麼」。

但在大多數情況下,self可以省略 - 因爲如果消息是沒有一個收件人發送,SWIFT將假設你打算把它發送到self

在您的示例中,baseDamage是一個實例變量,短語return self.baseDamage + ...出現在實例代碼中。因此,可以互換地使用baseDamageself.baseDamage,因爲Swift假設裸郵件baseDamage表示self.baseDamage

+0

並參見我的Swift教程:http://www.apeth.com/swiftBook/ch01.html# _self,http://www.apeth.com/swiftBook/ch04.html#_object_type_declarations_and_features。 – matt 2015-04-03 15:27:03