Swift 什么是';非标称类型';斯威夫特?
我在尝试扩展非正统的“类型”(如Swift 什么是';非标称类型';斯威夫特?,swift,Swift,我在尝试扩展非正统的“类型”(如(Int,Int),或Any)时看到此错误: 非标称类型“Any”不能扩展 那么,是什么让一个类型成为非名词性的呢?非命名类型(如Any或(Int)与常规命名类型(如Int)之间有什么区别?这有点像猜测(编辑:这是错误的,请看),但下面是: Any是协议,而不是实际类型。“名词”一词意味着命名(基于词根) 所以你不能扩展Any,因为它是一个协议,不是一个实际的类型,你也不能扩展(Int,Int),因为那只是一个元组文本,同样不是一个可以通过名称指定的实际类型 更
(Int,Int)
,或Any
)时看到此错误:
非标称类型“Any”不能扩展
那么,是什么让一个类型成为非名词性的呢?非命名类型(如
Any
或(Int)
与常规命名类型(如Int
)之间有什么区别?这有点像猜测(编辑:这是错误的,请看),但下面是:
Any
是协议,而不是实际类型。“名词”一词意味着命名(基于词根)
所以你不能扩展Any
,因为它是一个协议,不是一个实际的类型,你也不能扩展(Int,Int)
,因为那只是一个元组文本,同样不是一个可以通过名称指定的实际类型
更新: 当然,您可以扩展协议<代码>任何都不是协议,它是(令人震惊的)一种非标称类型,这是另外一种类型。阅读他做得很好。这是错误的;真正的答案来自斯威夫特打字系统中深奥的一部分 Swift中的大多数类型都是名义类型,它们是在特定模块中作为用户代码的一部分声明的“命名”类型。看似基本的类型,如
Int
和Array
实际上是Swift
模块中定义的结构,它会自动导入到每个Swift源文件中。即使是Optional
本身也是Swift
模块中的一个枚举,尽管编译器添加了一些魔术,比如可选链接和强制展开
少数例外情况称为“非标称类型”。可能还有其他的,但主要有:
- 函数类型,如
(Int)->String
- 元组类型,如
(Int,String)
- 元类型,如
(表达式的类型String.Type
)String.self
- 存在主义,如
CustomStringConvertible&Error
// You can put anything that conforms to `CustomStringConvertible` in `x`
let x: CustomStringConvertible
// You can put anything that conforms to both `CustomStringConvertible`
// and `Error` in `y`
let y: CustomStringConvertible & Error
// You can put anything in `z`; `Any` is an existential that doesn't
// require you to conform to any particular protocols
let z: Any
非标称类型都只是以某种特殊方式将其他类型组合在一起。(它们有时被称为“结构类型”,因为它们为其他类型定义了某种通用结构。)它们不需要明确定义,也不属于任何特定模块FooKit的(Int,String)
与BarKit的(Int,String)
相同。但它们的所有行为都是由语言定义的——非命名类型不能有自己的方法或属性,不能符合协议,因此不能扩展
因此,您不能扩展Any
,因为Any
是语言中内置的一种特殊元素,就像函数类型或元组类型一样。它只是碰巧有一个用字母写的名字,而不是用标点符号
(那么为什么您可以扩展
CustomStringConvertible
?因为,根据上下文,CustomStringConvertible
可能表示协议,也可能表示包含符合协议的值的存在。当您编写extension CustomStringConvertible
时,您是在扩展协议,但当您编写Any
,以使其更清晰。不过,现在他们正试图保持源代码的稳定性,这不太可能发生。)但它与协议不同。AnyObject
是一个协议,扩展会产生错误:protocol AnyObject不能扩展
。因此Any
是不同的Any
是空协议的typealias
的完整定义是typealias Any=protocol
。你可以梳理一下ine协议是这样的:typealias MyPrintableSequance=protocol
并使用它,就好像它是一个protocolI一样。我不知道协议可以组合,这很好。你是如何得到任何协议的完整定义的?@sjeohp我在操场上键入var x:Any
,然后在“Any”上单击-该文件只是标题,但在typealias的情况下,标题是全部内容,但Swift没有规定的协议扩展名?我在Swift 3中,在尝试扩展Any
时仍然会遇到相同的错误。我知道扩展Any
是一个糟糕的主意,但出于好奇,我正在尝试这样做Void
是另一个非名义的type@IslamQ.:更准确地说,Void是空元组的一种。为什么像CustomStringConvertible&Error
这样的类型不被称为确定型?存在型应该表示需要存在的一种功能。就编程代码执行而言,它是无效的。一些编译器的协议术语,如“存在性”和“见证性”来自于与数学谓词逻辑的类比。编译器开发人员理解这些术语对用户不太友好,并试图将它们排除在诊断和文档之外,但不幸的是,没有人能为“存在性”找到更好的面向用户的术语,所以其中一个泄漏了一点。我是通过在两个协议之间使用TypeAlias并尝试扩展组合协议而得到这个错误的。。。