大写“自我”与小写“自我”的区别

在斯威夫特游乐场玩的时候,我注意到大写字母“ S”的 Self和小写字母 self一起是可用的。他们之间有什么区别吗?如果是这样,那么这两种方法的用法是什么,特别是 Self

15131 次浏览

Self指的是协议内部当前“事物”的类型(任何符合协议的东西)。有关其用法的示例,请参见 协议函数返回自我

我为 Self找到的官方文档是在 协议相关类型声明中的快速编程语言。令人惊讶的是,在关于协议或嵌套类型的章节中没有记录:

但是,现在有一个 关于 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也可以在类中使用,并且非常有用。 给你是一篇关于它的文章。

这里有一个例子。你有一门课叫 MyClassMyClass具有返回它的实例的方法。现在添加 MyClass的一个子类 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)

打印出以下一行:

// 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

我认为这个问题可以用一个更简单的答案,更集中于 Selfself之间的 不同,也许是针对斯威夫特的新手。

self-显式引用它出现的类型的当前类型或实例。

class MyClass {
func showClass() {
print("\(self)")
}
}
let someClass = MyClass()
someClass.showClass()
// prints "MyClass"

Self-在 ABC1和 extension声明中特别使用指的是符合协议的最终类型。

protocol MyProtocol {
static func returnSelf() -> Self
}


class MyClass: MyProtocol {
// define class
}


MyClass.returnSelf()
// returns MyClass

不同之处在于,self用于类型的类型和实例,以引用它所在的类型; 而 Self用于协议和扩展,在这些协议和扩展中,实际的 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)