Swift 大写 "Self" 和小写 "self" 的区别
Distinction in Swift between uppercase "Self" and lowercase "self"
在 Swift 游乐场玩耍时,我注意到大写 "S" 的 Self
与小写 self
一起可用。它们之间有什么区别吗?如果是这样,这两个的用法是什么,特别是 Self
?
Self
指的是当前协议内部"thing"的类型(只要符合协议)。有关其使用示例,请参阅 Protocol func returning Self.
我为 Self
找到的官方文档位于 Swift 编程语言的 Protocol Associated Type Declaration 中。令人惊讶的是,它没有记录在协议或嵌套类型的部分中:
但是,现在有一个paragraph about Self Type
including a code example in the official Swift Programming Language's chapter about Types
在协议和扩展声明中使用 Self else self
extension protocolName where Self: UIView
{
func someFunction()
{
self.layer.shadowColor = UIColor.red.cgColor
}
}
Self 也可以用作协议扩展方法主体中的 return 类型,它将 return 确认类型实例,并用于 "as" 的类型转换。请看下面的例子:
extension <Protocol-Name> where Self:<Class-Name> {
static func foo(_ param:Type)-> Self{
guard let abc = method() as? Self else{
return xyz
}
}}
简而言之,Self可以用来引用确认协议的Type。
Self
也可以用在class中,很有用。 Here 是一篇关于它的文章。
这是一个例子。您有一个名为 MyClass
的 class。 MyClass
有方法 returning 它的实例。现在您添加一个 MyClass
的子 class,名为 MySubclass
。您希望这些方法 return MySubclass
的实例而不是 MyClass
。下面的代码展示了如何做到这一点。请注意,方法可以是实例方法或 class 方法。
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)
打印出以下行:
// Created
// modifid: Created
// MySubclass Created
// MySubclass modifid: MySubclass Created
我将 Self 理解为类型名称(例如 class 名称)并将 self 理解为 class/struct 的实例,例如:
struct Person {
static var documentNumner = "9484930"
var name: String
var computedFullName: String {
return ("\(self.name) with document number: \(Self.documentNumner)")
}
}
你不能将 self 与静态一起使用 属性 但你可以使用 Self
我认为这个问题可以使用更简单的答案,更侧重于 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
还没有的类型。
在此处阅读更多内容:
在 Swift 游乐场玩耍时,我注意到大写 "S" 的 Self
与小写 self
一起可用。它们之间有什么区别吗?如果是这样,这两个的用法是什么,特别是 Self
?
Self
指的是当前协议内部"thing"的类型(只要符合协议)。有关其使用示例,请参阅 Protocol func returning Self.
我为 Self
找到的官方文档位于 Swift 编程语言的 Protocol Associated Type Declaration 中。令人惊讶的是,它没有记录在协议或嵌套类型的部分中:
但是,现在有一个paragraph about Self Type
including a code example in the official Swift Programming Language's chapter about Types
在协议和扩展声明中使用 Self else self
extension protocolName where Self: UIView
{
func someFunction()
{
self.layer.shadowColor = UIColor.red.cgColor
}
}
Self 也可以用作协议扩展方法主体中的 return 类型,它将 return 确认类型实例,并用于 "as" 的类型转换。请看下面的例子:
extension <Protocol-Name> where Self:<Class-Name> {
static func foo(_ param:Type)-> Self{
guard let abc = method() as? Self else{
return xyz
}
}}
简而言之,Self可以用来引用确认协议的Type。
Self
也可以用在class中,很有用。 Here 是一篇关于它的文章。
这是一个例子。您有一个名为 MyClass
的 class。 MyClass
有方法 returning 它的实例。现在您添加一个 MyClass
的子 class,名为 MySubclass
。您希望这些方法 return MySubclass
的实例而不是 MyClass
。下面的代码展示了如何做到这一点。请注意,方法可以是实例方法或 class 方法。
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)
打印出以下行:
// Created
// modifid: Created
// MySubclass Created
// MySubclass modifid: MySubclass Created
我将 Self 理解为类型名称(例如 class 名称)并将 self 理解为 class/struct 的实例,例如:
struct Person {
static var documentNumner = "9484930"
var name: String
var computedFullName: String {
return ("\(self.name) with document number: \(Self.documentNumner)")
}
}
你不能将 self 与静态一起使用 属性 但你可以使用 Self
我认为这个问题可以使用更简单的答案,更侧重于 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
还没有的类型。
在此处阅读更多内容: