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

时间:2015-01-09 15:24:40

标签: swift self

在Swift游乐场玩游戏时,我注意到Self,大写字母为“S”,可以使用小写self。它们之间有什么区别吗?如果是这样,这两者的用法是什么,特别是Self

6 个答案:

答案 0 :(得分:66)

Self指的是协议内部当前“事物”的类型(符合协议的任何内容)。有关其用法的示例,请参阅Protocol func returning Self

我为Self找到的唯一正式文档位于Swift编程语言的Protocol Associated Type Declaration中。令人惊讶的是,在协议或嵌套类型的部分中没有记录。

答案 1 :(得分:7)

in protocol&扩展声明使用Self else self

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".AccountActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

答案 2 :(得分:7)

Self也可以在类中使用,并且很有用。 Here是有关此的文章。

这里是一个例子。您有一个名为MyClass的课程。 MyClass具有返回其实例的方法。现在,添加一个名为MyClass的{​​{1}}子类。您希望这些方法返回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)

答案 3 :(得分:4)

我认为这个问题可以使用更简单的答案,更着重于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尚未进入的类型。

在此处了解更多信息

答案 4 :(得分:1)

Self也可以在协议扩展方法主体中用作返回类型,该类型将返回确认类型实例,并用于使用“ as”进行类型转换。请参见下面的示例:

extension <Protocol-Name> where Self:<Class-Name> {
static func foo(_ param:Type)-> Self{
    guard let abc = method() as? Self else{
        return xyz
    }
}}

简而言之,“自我”可以用来指代确认协议的“类型”。

答案 5 :(得分:0)

例如,我将Self理解为类型名称(例如,类名),并且将self理解为class / struct的实例:

        17:07:02.849 [reactor-http-epoll-3] DEBUG org.springframework.web.server.adapter.HttpWebHandlerAdapter - [c9c29225] HTTP POST "/mytesyapp/user/registration/passenger"
        17:07:02.852 [reactor-http-epoll-3] DEBUG org.springframework.web.server.adapter.HttpWebHandlerAdapter - [c9c29225] Completed 403 FORBIDDEN

您不能将self与静态属性一起使用,但是可以使用Self