CGSize不接受".zero"。'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)

它显示错误为:

"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。但斯威夫特偏爱国际。例如:

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)来说,斯威夫特不知道该给哪个.zero打电话。

最新更新