当您编写协议和协议扩展时,Self(大写S)和self(小写S)之间存在差异。当与大写S一起使用时,Self指的是符合协议的类型,例如, String
或Int
。当与小写字母S一起使用时,self指的是该类型内的值,例如“你好斯威夫特”或786。
例如,考虑BinaryInteger
上的这个扩展:
extension BinaryInteger {
func squared() -> Self {
return self * self
}
}
请记住,具有大写字母S的自我指的是符合协议的任何类型。在上面的例子中,Int
符合BinaryInteger
,因此当调用Int
时,该方法有效地读取:
func squared() -> Int {
return self * self
}
另一方面,带小写字母S的self指的是类型所持有的任何值。如果在存储值为8的Int
上调用上面的示例,则实际上是这样的:
func squared() -> Int {
return 8 * 8
}
你应该使用self
,而不是Self
。
此外,正如其他人所说,尝试self.dynamicType
。
此外,我建议你谷歌谷歌“如何检查类型Swift”。
希望有帮助:)
引用此链接:Distinction in Swift between uppercase "Self" and lowercase "self"
“Self指的是协议内部当前”thing“的类型(符合协议的任何内容)。有关其使用的示例,请参阅Protocol func returns Self。
我为Self发现的唯一官方文档是Swift编程语言中的协议关联类型声明。令人惊讶的是,在协议或嵌套类型的章节中没有记录。“