Swift中区分大写“Self”和小写“Self”

sigwle7e  于 2022-11-21  发布在  Swift
关注(0)|答案(7)|浏览(199)

当我在Swift游戏场玩的时候,我注意到Self,大写的“S”,和小写的self沿着使用。它们之间有什么区别吗?如果有,这两个词的用法是什么,特别是Self

bakd9h0s

bakd9h0s1#

Self指的是协议中当前“事物”的类型(任何符合协议的事物)。有关其用法的示例,请参见Protocol func returning Self
我在Swift编程语言的Protocol Associated Type Declaration中找到了关于Self的官方文档,但令人惊讶的是,它并没有在关于协议或嵌套类型的章节中得到说明:
但是,现在有一段关于Self Type的内容,其中包括Swift编程语言官方的chapter about Types中的一个代码示例

mrfwxfqh

mrfwxfqh2#

Self也可以在类中使用,非常有用。Here是一篇关于它的文章。
下面是一个例子。你有一个名为MyClass的类。MyClass有返回它的示例的方法。现在你添加一个名为MySubclassMyClass的子类。你想让这些方法返回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
dtcbnfnu

dtcbnfnu3#

在协议和扩展声明中使用Self else self

extension protocolName where Self: UIView 
{
  func someFunction()
  {
    self.layer.shadowColor = UIColor.red.cgColor
  }
}
8iwquhpp

8iwquhpp4#

我认为这个问题可以用一个更简单的答案,更关注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用于类型和类型示例中,以引用它所在的类型;而X1 M7 N1 X用于其中实际的X1 M8 N1 X还未知的协议和扩展中。
用更简单的术语来说,self在现有类型中使用; Self用来指涉Self尚未加入的型别。
点击此处阅读更多信息:

kupeojn6

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

7qhs6swi

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)
twh00eeo

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可用于引用符合协议的类型。

相关问题