当我在Swift游戏场玩的时候,我注意到Self,大写的“S”,和小写的self沿着使用。它们之间有什么区别吗?如果有,这两个词的用法是什么,特别是Self?
Self
self
bakd9h0s1#
Self指的是协议中当前“事物”的类型(任何符合协议的事物)。有关其用法的示例,请参见Protocol func returning Self。我在Swift编程语言的Protocol Associated Type Declaration中找到了关于Self的官方文档,但令人惊讶的是,它并没有在关于协议或嵌套类型的章节中得到说明:但是,现在有一段关于Self Type的内容,其中包括Swift编程语言官方的chapter about Types中的一个代码示例
Self Type
mrfwxfqh2#
Self也可以在类中使用,非常有用。Here是一篇关于它的文章。下面是一个例子。你有一个名为MyClass的类。MyClass有返回它的示例的方法。现在你添加一个名为MySubclass的MyClass的子类。你想让这些方法返回MySubclass的示例而不是MyClass的示例。下面的代码演示了如何做。注意,这些方法可以是示例方法,也可以是类方法。
MyClass
MySubclass
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
dtcbnfnu3#
在协议和扩展声明中使用Self else self
extension protocolName where Self: UIView { func someFunction() { self.layer.shadowColor = UIColor.red.cgColor } }
8iwquhpp4#
我认为这个问题可以用一个更简单的答案,更关注Self和self之间的差异,也许针对的是Swift的新手。
class MyClass { func showClass() { print("\(self)") } } let someClass = MyClass() someClass.showClass() // prints "MyClass"
protocol
extension
protocol MyProtocol { static func returnSelf() -> Self } class MyClass: MyProtocol { // define class } MyClass.returnSelf() // returns MyClass
不同之处在于self用于类型和类型示例中,以引用它所在的类型;而X1 M7 N1 X用于其中实际的X1 M8 N1 X还未知的协议和扩展中。用更简单的术语来说,self在现有类型中使用; Self用来指涉Self尚未加入的型别。点击此处阅读更多信息:
kupeojn65#
我将Self理解为类型名称(例如类名),将Self理解为类/结构的示例,例如:
struct Person { static var documentNumner = "9484930" var name: String var computedFullName: String { return ("\(self.name) with document number: \(Self.documentNumner)") } }
不能将self与静态属性一起使用,但可以使用Self
7qhs6swi6#
self- 指的是类的示例或对象。**
class SampleClassOne { let name: String init(name: String) { self.name = name } }
Self- 是指协议或扩展的类型。**
class SampleClassTwo { static let name: String = "Hello" private func printName() { print("\(Self.name)") } } protocol SampleProtocol { func sampleFunc() -> Self }
再举一个例子来简单地理解起来。
extension Int { var add: Self { //refer to the Type return self + 100 //refer to the instance } } print(5.add)
twh00eeo7#
Self也可以在协议扩展方法体中用作返回类型,该方法体将返回确认类型示例,并用于使用“as”的类型转换。请参见下面的示例:
extension <Protocol-Name> where Self:<Class-Name> { static func foo(_ param:Type)-> Self{ guard let abc = method() as? Self else{ return xyz } }}
简而言之,Self可用于引用符合协议的类型。
7条答案
按热度按时间bakd9h0s1#
Self
指的是协议中当前“事物”的类型(任何符合协议的事物)。有关其用法的示例,请参见Protocol func returning Self。我在Swift编程语言的Protocol Associated Type Declaration中找到了关于
Self
的官方文档,但令人惊讶的是,它并没有在关于协议或嵌套类型的章节中得到说明:但是,现在有一段关于
Self Type
的内容,其中包括Swift编程语言官方的chapter about Types中的一个代码示例mrfwxfqh2#
Self
也可以在类中使用,非常有用。Here是一篇关于它的文章。下面是一个例子。你有一个名为
MyClass
的类。MyClass
有返回它的示例的方法。现在你添加一个名为MySubclass
的MyClass
的子类。你想让这些方法返回MySubclass
的示例而不是MyClass
的示例。下面的代码演示了如何做。注意,这些方法可以是示例方法,也可以是类方法。打印出以下行:
dtcbnfnu3#
在协议和扩展声明中使用Self else self
8iwquhpp4#
我认为这个问题可以用一个更简单的答案,更关注
Self
和self
之间的差异,也许针对的是Swift的新手。self
-对当前类型或类型示例的显式引用。Self
- * 专门用于protocol
和extension
声明 *,以引用将符合协议的最终类型。不同之处在于
self
用于类型和类型示例中,以引用它所在的类型;而X1 M7 N1 X用于其中实际的X1 M8 N1 X还未知的协议和扩展中。用更简单的术语来说,
self
在现有类型中使用;Self
用来指涉Self
尚未加入的型别。点击此处阅读更多信息:
self
至https://docs.swift.org/swift-book/ReferenceManual/Expressions.htmlkupeojn65#
我将Self理解为类型名称(例如类名),将Self理解为类/结构的示例,例如:
不能将self与静态属性一起使用,但可以使用Self
7qhs6swi6#
self- 指的是类的示例或对象。**
Self- 是指协议或扩展的类型。**
再举一个例子来简单地理解起来。
twh00eeo7#
Self也可以在协议扩展方法体中用作返回类型,该方法体将返回确认类型示例,并用于使用“as”的类型转换。请参见下面的示例:
简而言之,Self可用于引用符合协议的类型。