大写"自我"和小写"自我"之间的区别Swift

Era*_*ler 66 self swift

在Swift游乐场玩耍的时候,我注意到,Self大写字母"S"可以和小写一起使用self.它们之间有什么区别吗?如果是这样,这两者的用途是什么,特别是对于Self

Rob*_*ier 70

Self指协议内部的当前"事物"的类型(符合协议的任何内容).有关其用法的示例,请参阅返回Self的Protocol func.

我找到的唯一官方文档Self是Swift编程语言中的协议关联类型声明.令人惊讶的是,在协议或嵌套类型的章节中没有记录.

  • 它在WWDC 2015关于面向协议编程的视频中得到了很好的报道:https://developer.apple.com/videos/wwdc/2015/?id = 408 - 在视频中转到16:05以获取Self类型的确切部分. (12认同)
  • 我有一个挑剔,迂腐的一天.但别担心!我从疏远我的朋友那里抽出时间说:要从技术上完全回答这个问题,这个答案应该明确地说"自我"主要是Objective-C人们认为的那个.讨论结构,枚举等,可能是一个不必要的绕道. (3认同)

Dev*_*esh 7

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

extension protocolName where Self: UIView 
{
  func someFunction()
  {
    self.layer.shadowColor = UIColor.red.cgColor
  }
}
Run Code Online (Sandbox Code Playgroud)


uki*_*kim 7

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)
Run Code Online (Sandbox Code Playgroud)

打印以下行:

// Created
// modifid: Created
// MySubclass Created
// MySubclass modifid: MySubclass Created
Run Code Online (Sandbox Code Playgroud)


And*_*ndy 6

我认为这个问题可以用一个简单的答案,更多的集中于差异之间Selfself,也许是针对那些较新的斯威夫特。

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

class MyClass {
  func showClass() {
       print("\(self)")
    }
  }
let someClass = MyClass()
someClass.showClass()
// prints "MyClass"
Run Code Online (Sandbox Code Playgroud)

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

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

class MyClass: MyProtocol {
   // define class
}

MyClass.returnSelf() 
// returns MyClass
Run Code Online (Sandbox Code Playgroud)

区别在于self在类型和类型的实例中使用它来引用它所在的类型;并Self用于协议和扩展中,实际type情况尚不清楚。

更简单地说,self在现有类型中使用;Self用于指代Self尚未进入的类型。

在此处阅读更多信息: