在斯威夫特游乐场玩的时候,我注意到大写字母“ S”的 Self和小写字母 self一起是可用的。他们之间有什么区别吗?如果是这样,那么这两种方法的用法是什么,特别是 Self?
Self
self
Self指的是协议内部当前“事物”的类型(任何符合协议的东西)。有关其用法的示例,请参见 协议函数返回自我。
我为 Self找到的官方文档是在 协议相关类型声明中的快速编程语言。令人惊讶的是,在关于协议或嵌套类型的章节中没有记录:
但是,现在有一个 关于 Self Type的段落包括一个代码示例在官方的快速编程语言的 关于类型的一章
Self Type
在协议和扩展声明中使用 Self else Self
extension protocolName where Self: UIView { func someFunction() { self.layer.shadowColor = UIColor.red.cgColor } }
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 可以用来引用确认协议的 Type。
Self也可以在类中使用,并且非常有用。 给你是一篇关于它的文章。
这里有一个例子。你有一门课叫 MyClass。MyClass具有返回它的实例的方法。现在添加 MyClass的一个子类 MySubclass。您希望这些方法返回 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
我将 Self 理解为类型名(例如类名) ,将 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之间的 不同,也许是针对斯威夫特的新手。
class MyClass { func showClass() { print("\(self)") } } let someClass = MyClass() someClass.showClass() // prints "MyClass"
extension
protocol MyProtocol { static func returnSelf() -> Self } class MyClass: MyProtocol { // define class } MyClass.returnSelf() // returns MyClass
不同之处在于,self用于类型的类型和实例,以引用它所在的类型; 而 Self用于协议和扩展,在这些协议和扩展中,实际的 type还不知道。
type
用更简单的术语来说,self在现有类型中使用; Self用于引用 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)