我如何处理Int和CGFloat之间的操作?

时间:2014-06-07 08:08:57

标签: objective-c swift

在Objective-C中,我可以执行以下操作:

Objective-C代码:

CGFloat width = CGRectGetWidth(mView.bounds);
CGFloat total = width*[myArray count];

但在Swift中,它会引发错误:

  

无法找到' *'接受提供的参数

我怎样才能优雅地避免这种情况?

4 个答案:

答案 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.countInt)乘以宽度(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