前提条件失败:不允许否定计数

时间:2018-03-16 01:34:30

标签: swift string int repeat uint

错误:

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对整数值的一致使用有助于代码   互操作性,避免了在不同数量之间进行转换的需要   类型,并匹配整数类型推断,如类型安全中所述   和类型推断。

Apple Docs

好的,Int是首选,因此API只是遵循规则,但为什么Strings API的设计是这样的?为什么这个构造函数不是私有的,而UInt的公共构造函数是这样的?有“真实”的原因吗?这有些“未定义的行为”吗?

另外:https://forums.developer.apple.com/thread/98594

1 个答案:

答案 0 :(得分:0)

这不是未定义的行为 - 事实上,前提条件表明完全相反:进行了明确的检查以确保给定的count为正。

至于为什么参数是Int而不是UInt - 这是Swift设计早期作出的两个决定的结果:

  1. 与C和Objective-C不同,Swift不允许在整数类型之间进行隐式(甚至显式)转换。您无法将Int传递给采用UInt的函数,反之亦然,以下投射也不会成功:myInt as? UInt。 Swift的首选转换方法是使用初始值设定项:UInt(myInt)
  2. 由于IntUInt更普遍适用,因此它们将是首选的整数类型
  3. 因此,由于IntUInt之间的转换可能很麻烦且冗长,因此在最大数量的API之间进行互操作的最简单方法是使用公共整数来编写它们货币类型:Int。正如您引用的文档所述,这可以帮助代码互操作,避免在不同数字类型之间进行转换,并匹配整数类型推理&#34 ;;在无效输入的运行时捕获是这个决定的权衡。

    事实上,Int在Swift中根深蒂固,当从Objective-C将Apple框架接口导入Swift时,NSUInteger参数和返回类型将转换为Int而不是UInt,提高了互操作性。