CGSize 不接受“.zero”。 'init(width:height:)' 的使用不明确

CGSize is not accepting `.zero`. Ambiguous use of 'init(width:height:)'

UICollectionViewDelegateFlowLayout时我正在使用:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width: 0, height: 0)
}

它工作正常。

但是当我尝试时:

CGSize(width: .zero, height: .zero)

它显​​示错误为:

Ambiguous use of 'init(width:height:)'

事实上:

CGSize(width: .zero, height: 0)

也有效。它只是添加两者,因为 .zero 不起作用。

语法

CGSize(width: .zero, height: 0)

即使有效也不推荐。


.zeroCGSize的静态变量,可以适当使用

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize.zero
}

甚至

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return .zero
}

CGSize.init(width:height:) 有三个版本:Double、CGFloat 和 Int。所有这三个都有一个 .zero 静态方法。所以当你通过(.zero, .zero)时,Xcode不知道调用哪个版本。

当您传递 0 时,这是一个整数文字。任何符合 ExpressibleByIntegerLiteral 的东西都可以用它来初始化。这包括所有 Int 和 UInt 类型(UInt8、Int16 等),还包括浮点类型(Float、Double)、基础类型(如 NSNumber),甚至 RealityKit 中的 MaterialScalarParameter。但是 Swift 偏爱 Int。例如:

let x = 0

这里,x 是 Int,尽管这在技术上是模棱两可的。 Swift 通常不喜欢一种类型优于另一种类型,但它有文字的特殊情况。不过,它没有像 .zero 这样的静态方法的特殊情况。

因此对于 CGSize(width: 0, height: 0),它使用 Int 版本,因为您传递的是整数文字。 CGSize(width: .zero, height: 0),也是用Int版本,因为height参数是字面量,Int.zero存在,所以可以用。但是对于CGSize(width: .zero, height: .zero),Swift不知道要调用哪个.zero