我看到了这段代码,但我不理解语法的作用。我在网上找过了,但是没有找到任何东西。
Q1。它是做什么的?Q2。你要如何找出一个特定的语法是如何工作的?
public extension AppleMusicClient {
static let denied = Self(
musicAuthorizationStatus: .denied,
playSong: { _ in .none },
requestMusicAuthorization: { .none },
searchRequest: { _ in .none }
)
static let noop = Self(
musicAuthorizationStatus: .authorized,
playSong: { _ in .none },
requestMusicAuthorization: { .none },
searchRequest: { _ in .none }
)
简单来说,Self
只是当前类型名称的同义词,在本例中为AppleMusicClient
。也就是说,相同的静态常量可以定义为
public extension AppleMusicClient {
static let denied = AppleMusicClient(...
static let noop = AppleMusicClient(
那么为什么使用Self
,而不是直接使用类型名呢?最好在原始SR中描述:
- Self的意图更短、更清晰。它镜像self,它指向当前实例。
- 它提供了一种更简单的方式来访问静态成员。类型名越大,可读性就越差。MyExtremelyLargeTypeName。staticMember的输入和读取都很笨拙。
- 使用硬连接类型名的代码比自动知道其类型的代码更不容易移植。
- 重命名类型意味着更新代码中的所有TypeName引用。
参见:更详细的解释。
关于Q2 (">你如何真正去发现一个特定的语法是如何工作的?"): Swift语言参考在那里给你。通常,每次你升级你的Xcode(也会更新Swift版本)时,检查Revision History看看你当前的Swift版本有什么变化是一个好主意。例如,在Swift 5.1的变更日志中提到了Self
的变化:
更新了Self Type部分,现在Self可以用来引用当前类、结构体或枚举声明引入的类型。