相信大家都知道self关键字的作用, 但你知道Swift还有个Self关键字吗?
Self关键字只能用在类里, 作为函数返回值类型, 表示当前类。
类定义.png
这段代码里有self和Self, self指向类自身;Self只能作为函数关键字, setValue函数的返回值是ClassA类型。
我们看到有个warning, 就是setValue函数的返回值没有被使用; 这时可以用注解@discardableResult解决。
注解.png
PS: Self关键字常常和@discardableResult配对使用。
<pre>var objA: ClassA? = ClassA(a: 1, b: 2)
var objB = objA?.setValueA(param: 3)
print("objA a: (objB!.a)")
objB = nil
objA = nil</pre> Swift的类是引用传递, 上面的objA和objB指向同一个对象, 即引用计数为2, 将2者都设置为nil后立即执行析构函数deinit。
日志:
objA a: 3
ClassA deinit
参考上面类的写法,编写一个结构体,但结构体不支持Self关键字!
<pre>struct StructA {
var a: Int
var b: Int
init(a: Int, b: Int) {
self.a = a
self.b = b
}
@discardableResult
mutating func setValueA(param: Int) -> StructA {
self.a = param
return self
}
}
var structA = StructA(a: 1, b: 2)
var structB = structA.setValueA(param: 3)
print("structA a: (structA.a), structB a: (structB.a)")
structB.a = 4
print("after set 4, structA a: (structA.a), structB a: (structB.a)")
</pre>结构体是值传递, setValueA会新生成一个相同的实例。
日志:
structA a: 3, structB a: 3
after set 4, structA a: 3, structB a: 4
声明一个枚举说明值传递。
<pre> enum EnumA: Int {
case Monday
case Tuesday
}
extension EnumA {
func getEnum(a: Int) -> EnumA {
switch a {
case 1:
return .Monday
case 2:
return .Tuesday
default:
return self
}
}
}
var enumA: EnumA = .Tuesday
var enumB = enumA.getEnum(a: 0)
print("enumA: (enumA.rawValue), enumB:(enumB.rawValue)")
enumB = .Monday
print("after set monday, enumA: (enumA.rawValue), enumB:(enumB.rawValue)")</pre>
输出:
enumA: 1, enumB:1
after set monday, enumA: 1, enumB:0
网友评论