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

我认为这个问题可以使用更简单的答案,更侧重于 Selfself 之间的 差异 ,并且可能针对刚接触的人Swift.

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

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

Self - 专门用于 protocolextension 声明 以指代符合协议的最终类型。

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

class MyClass: MyProtocol {
   // define class
}

MyClass.returnSelf() 
// returns MyClass

不同之处在于,self用于类型和类型的实例中,以引用它所在的类型; Self 用于实际 type 未知的协议和扩展中。

更简单地说,self 在现有类型中使用; Self 用于指代 Self 还没有的类型。

在此处阅读更多内容: