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)
即使有效也不推荐。
.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。但是 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
。
在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)
即使有效也不推荐。
.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。但是 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
。