我什么时候使用自己的财产?

时间:2015-04-03 04:45:41

标签: ios objective-c oop swift

我正在努力更好地掌握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
}
}

3 个答案:

答案 0 :(得分:1)

类定义描述了类的属性和方法,例如汽车的计划描述了它的大小,座位数等等 - 但是你无法驱动计划,你需要一个汽车的实际实例从那些计划。

与对象类相似 - 您需要一个类的实际实例来操作。

给出一个简单的Car类 -

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

请注意,这不是Swift或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

在Swift中,您可以省略self,在Objective-C中,您可以使用_fuelTank(或@synthesized的任何支持变量)直接访问属性支持变量,但最好是养成使用self的习惯,因为它清楚地表明您正在访问属性而不是本地或全局变量。同样在Objective-C中,它确保调用任何setter / getter方法。

您可以定义类方法 - 这些方法不能在任何特定实例上运行。在Objective-C中,你经常会看到" constructor"将两阶段alloc / init包装到单个Class方法中的类方法,而不是说:

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

你可以说

 Car *redCar=[Car carWithColor:red];

答案 1 :(得分: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.

我希望这会对你有所帮助。

答案 2 :(得分:0)

在类代码中 - 例如类方法,静态方法或类属性的初始化程序 - self表示“此类,无论它是什么”。

在实例代码中 - 例如实例方法或实例属性的初始化程序 - self表示“此实例,无论它是什么”。

但在大多数情况下,self可以省略 - 因为如果邮件是在没有收件人的情况下发送的,Swift将假设您打算将其发送到self

在您的示例中,baseDamage是实例变量,短语return self.baseDamage + ...出现在实例代码中。因此,您可以互换地说baseDamageself.baseDamage,因为Swift假定裸信息baseDamage 表示 self.baseDamage