1

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不起作用。

4

2 回答 2

4

语法

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
}
于 2019-12-18T15:16:43.580 回答
4

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

当您通过0时,这是一个整数文字。任何符合 ExpressibleByIntegerLiteral 的东西都可以使用它来初始化。这包括所有 Int 和 UInt 类型(UInt8、Int16 等),还包括浮点类型(Float、Double)、NSNumber 等基础类型,甚至是 RealityKit 中的 MaterialScalarParameter。但斯威夫特偏爱 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调用哪个。

于 2019-12-18T15:16:53.017 回答