在Objective-C中,我可以执行以下操作:
CGFloat width = CGRectGetWidth(mView.bounds);
CGFloat total = width*[myArray count];
但在Swift中,它会引发错误:
无法找到' *'接受提供的参数
我怎样才能优雅地避免这种情况?
答案 0 :(得分:32)
首先,让我们创建一些演示数据
let array: NSArray = ["a", "b", "c"] //you could use a Swift array, too
let view = UIView() //just some view
现在,其他一切的工作方式几乎与Obj-C
相同let width: CGFloat = CGRectGetWidth(view.bounds)
或只是
let width = CGRectGetWidth(rect) //type of the variable is inferred
和总计:
let total = width * CGFloat(array.count)
请注意,我们必须为CGFloat
添加array.count
广告。 Obj-C会隐式地将NSUInteger
强制转换为CGFloat
但是Swift没有隐式强制转换,所以我们必须添加一个明确的强制转换。
答案 1 :(得分:8)
在Swift中,你不能直接乘以两个不同类型的数字(NSNumber,Int,Double等)。 CGRect的宽度是浮点类型,数组计数是整数类型。这是一个有效的例子:
let myArray: Int[] = [1,2,3]
let rect: CGRect = CGRect(x:0,y:0,width:100,height:100)
let total: Double = rect.size.width * Double(myArray.count)
答案 2 :(得分:3)
Swift不允许两个不同类型之间的操作。因此,在将array.count
(Int
)乘以宽度(CGFloat
)之前,您必须将其转换为CGFloat
。
幸运的是,Swift提供了一个简单的CGFloat
初始值设定项init(_:)
,可以从CGFloat
创建一个新的Int
。此初始化程序具有以下声明:
init<Source>(_ value: Source) where Source : BinaryInteger
创建一个新值,四舍五入到最接近的可能表示。
下面的Swift 5 Playground示例代码显示了如何使用CGFloat
的初始化程序执行计算:
import UIKit
import CoreGraphics
// Set array and view
let array = Array(1...3)
let rect = CGRect(x: 0, y: 0, width: 100, height: 100)
let view = UIView(frame: rect)
// Perform operation
let width = view.bounds.width
let total = width * CGFloat(array.count)
print(total) // prints: 300.0
答案 3 :(得分:0)
需要将All Int更改为CGFloat类型,或将All CGFloat更改为Int
let a: CGFloat = 0.25
let b: Int = 1
// wrong: Binary operator '*' cannot be applied to operands of type 'CGFloat' and 'Int'
// let c = a * b
// right: change All Int to CGFloat Type
let r = a * CGFloat(b)
// right: change All CGFloat to Int
let r = Int(a) * b