在Swift游乐场玩游戏时,我注意到Self
,大写字母为“S”,可以使用小写self
。它们之间有什么区别吗?如果是这样,这两者的用法是什么,特别是Self
?
答案 0 :(得分:66)
Self
指的是协议内部当前“事物”的类型(符合协议的任何内容)。有关其用法的示例,请参阅Protocol func returning Self。
我为Self
找到的唯一正式文档位于Swift编程语言的Protocol Associated Type Declaration中。令人惊讶的是,在协议或嵌套类型的部分中没有记录。
答案 1 :(得分:7)
in protocol&扩展声明使用Self else self
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".AccountActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
答案 2 :(得分:7)
Self
也可以在类中使用,并且很有用。 Here是有关此的文章。
这里是一个例子。您有一个名为MyClass
的课程。 MyClass
具有返回其实例的方法。现在,添加一个名为MyClass
的{{1}}子类。您希望这些方法返回MySubclass
而不是MySubclass
的实例。以下代码显示了如何执行此操作。请注意,这些方法可以是实例方法或类方法。
MyClass
打印出以下行:
class MyClass: CustomStringConvertible {
let text: String
// Use required to ensure subclasses also have this init method
required init(text: String) {
self.text = text
}
class func create() -> Self {
return self.init(text: "Created")
}
func modify() -> Self {
return type(of: self).init(text: "modifid: " + text)
}
var description: String {
return text
}
}
class MySubclass: MyClass {
required init(text: String) {
super.init(text: "MySubclass " + text)
}
}
let myClass = MyClass.create()
let myClassModified = myClass.modify()
let mySubclass = MySubclass.create()
let mySubclassModified = mySubclass.modify()
print(myClass)
print(myClassModified)
print(mySubclass)
print(mySubclassModified)
答案 3 :(得分:4)
我认为这个问题可以使用更简单的答案,更着重于Self
和self
之间的差异,也许针对的是Swift新手。
self
-显式引用当前类型或类型的实例。class MyClass {
func showClass() {
print("\(self)")
}
}
let someClass = MyClass()
someClass.showClass()
// prints "MyClass"
Self
-在protocol
和extension
声明中专门使用来表示符合协议的最终类型。protocol MyProtocol {
static func returnSelf() -> Self
}
class MyClass: MyProtocol {
// define class
}
MyClass.returnSelf()
// returns MyClass
区别在于self
用于类型和类型的实例中以引用其所在的类型。和Self
用于尚不知道实际type
的协议和扩展。
更简单地说,self
用于现有的类型; Self
用于指代Self
尚未进入的类型。
在此处了解更多信息
答案 4 :(得分:1)
Self也可以在协议扩展方法主体中用作返回类型,该类型将返回确认类型实例,并用于使用“ as”进行类型转换。请参见下面的示例:
extension <Protocol-Name> where Self:<Class-Name> {
static func foo(_ param:Type)-> Self{
guard let abc = method() as? Self else{
return xyz
}
}}
简而言之,“自我”可以用来指代确认协议的“类型”。
答案 5 :(得分:0)
例如,我将Self理解为类型名称(例如,类名),并且将self理解为class / struct的实例:
17:07:02.849 [reactor-http-epoll-3] DEBUG org.springframework.web.server.adapter.HttpWebHandlerAdapter - [c9c29225] HTTP POST "/mytesyapp/user/registration/passenger"
17:07:02.852 [reactor-http-epoll-3] DEBUG org.springframework.web.server.adapter.HttpWebHandlerAdapter - [c9c29225] Completed 403 FORBIDDEN
您不能将self与静态属性一起使用,但是可以使用Self