错误:
Precondition failed: Negative count not allowed: file /BuildRoot/Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-900.0.74.1/src/swift/stdlib/public/core/StringLegacy.swift, line 49
代码:
String(repeating: "a", count: -1)
思维:
嗯,将一些字符串重复一次是没有意义的。由于我们在Swift中有类型,为什么不使用UInt
?
这里有一些关于它的文档。
仅当您特别需要无符号整数类型时才使用UInt 与平台的原生单词大小相同。如果这不是 case,Int是首选,即使知道要存储的值也是如此 是非负的。 Int对整数值的一致使用有助于代码 互操作性,避免了在不同数量之间进行转换的需要 类型,并匹配整数类型推断,如类型安全中所述 和类型推断。
好的,Int
是首选,因此API只是遵循规则,但为什么Strings API的设计是这样的?为什么这个构造函数不是私有的,而UInt
的公共构造函数是这样的?有“真实”的原因吗?这有些“未定义的行为”吗?
答案 0 :(得分:0)
这不是未定义的行为 - 事实上,前提条件表明完全相反:进行了明确的检查以确保给定的count
为正。
至于为什么参数是Int
而不是UInt
- 这是Swift设计早期作出的两个决定的结果:
Int
传递给采用UInt
的函数,反之亦然,以下投射也不会成功:myInt as? UInt
。 Swift的首选转换方法是使用初始值设定项:UInt(myInt)
Int
比UInt
更普遍适用,因此它们将是首选的整数类型因此,由于Int
和UInt
之间的转换可能很麻烦且冗长,因此在最大数量的API之间进行互操作的最简单方法是使用公共整数来编写它们货币类型:Int
。正如您引用的文档所述,这可以帮助代码互操作,避免在不同数字类型之间进行转换,并匹配整数类型推理&#34 ;;在无效输入的运行时捕获是这个决定的权衡。
事实上,Int
在Swift中根深蒂固,当从Objective-C将Apple框架接口导入Swift时,NSUInteger
参数和返回类型将转换为Int
而不是UInt
,提高了互操作性。