When you’re writing protocols and protocol extensions, there’s a difference between Self (capital S) and self (lowercase S). When used with a capital S, Self refers to the type that conform to the protocol, e.g. String
or Int
. When used with a lowercase S, self refers to the value inside that type, e.g. “hello Swift” or 786.
As an example, consider this extension on BinaryInteger
:
extension BinaryInteger {
func squared() -> Self {
return self * self
}
}
Remember, Self with a capital S refers to whatever type is conforming to the protocol. In the example above, Int
conforms to BinaryInteger
, so when called on Int
the method effectively reads this:
func squared() -> Int {
return self * self
}
On the other hand, self with a lowercase S refers to whatever value the type holds. If the example above were called on an Int
storing the value 8 it would effectively be this:
func squared() -> Int {
return 8 * 8
}