我正在努力更好地掌握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 :(得分: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
内,我无法引用blueCar
和redCar
,因为这些只是类定义之外的实例。这是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 + ...
出现在实例代码中。因此,您可以互换地说baseDamage
或self.baseDamage
,因为Swift假定裸信息baseDamage
表示 self.baseDamage
。