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
时,您是在扩展协议,但当您编写时e> 设x:CustomStringConvertible,您正在声明一个类型为“包含符合协议的值的存在性”的变量。这有点让人困惑,一些Swift的维护人员实际上希望将存在主义代码写成
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并尝试扩展组合协议而得到这个错误的。。。