当我使用时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)
无论如何都不建议使用,即使它有效。
.zero
是CGSize
的静态变量,可以正确使用
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
打电话。