Swift中的'self'和'Self'有什么区别?

4

enter image description here

问题:'self' 和 'Self' 之间有什么区别?当我在超类中定义一个返回子类类型的函数实现时,如何使用 "Self"?

代表函数调用者的 self 类型应该返回什么类型?是基础类型 NSObject 还是其他类型?


4
请发布实际的代码而不是屏幕截图。有关详细信息,请参见此处。谢谢。 - Pang
Self仅用于泛型约束。您可能想要使用self.dynamicType - fluidsonic
你需要返回类似于 self.dynamicType.init() 的东西。但是你只能调用被标记为 required 的初始化方法。 - fluidsonic
2个回答

17
当你编写协议和协议扩展时,使用大写字母 S 的 Self 和小写字母 s 的 self 是有区别的。使用大写字母 S 的 Self 指的是符合该协议的类型,例如 StringInt。而使用小写字母 s 的 self 则指代类型内部的值,比如“hello Swift”786

以对BinaryInteger的这个扩展为例:

extension BinaryInteger {
    func squared() -> Self {
        return self * self
    }
}

记住,大写字母S的Self是指符合协议的任何类型。在上面的例子中,Int符合BinaryInteger,因此当在Int上调用该方法时,实际上读取的是:

func squared() -> Int {
    return self * self
}

另一方面,用小写字母self指代类型所持有的任何值。如果在一个存储值为8的Int上调用上面的示例,它将有效地是这样的:

func squared() -> Int {
    return 8 * 8
}

-2

你应该使用self,而不是Self

另外,正如其他人所指出的,尝试使用self.dynamicType

此外,我建议你在谷歌上搜索“如何检查Swift类型”。

希望这有所帮助 :)

引用自此链接:Swift中大写“Self”和小写“self”的区别

“Self指的是协议内部当前‘thing’的类型(任何符合协议的内容)。关于它的使用示例,请参见Protocol func returning Self。

我找到的唯一官方文档是在The Swift Programming Language的Protocol Associated Type Declaration中。令人惊讶的是,在协议或嵌套类型的章节中没有记录它。”

此外:https://forums.developer.apple.com/thread/5479


3
嗨,我看到原帖的问题是这两者之间的区别,而不是要选择哪个使用。因此,请在您的帖子中包含一个实际回答问题的答案。 - LinusGeffarth
另外,建议将“谷歌一下”作为注释而不是答案 :) - Hacketo
有时候,当答案已经可以在网络上轻松找到时,这就是你能给出的唯一答案... - user3578549

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接