无法将'Float'类型的值转换为预期参数'CGFloat'

时间:2015-12-25 00:41:04

标签: ios swift

我已经搜索了一段时间的答案了。 在一般的编码方面,我是一个绝对的菜鸟,但我想我会尝试一下。 我正在尝试使用3(3)个滑块(R,G,B)编写一些代码来更改视图的颜色。

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var colorView: UIView!


    @IBOutlet weak var redSlider: UISlider!
    @IBAction func redValueChanged(sender: UISlider) {
    var red = CGFloat(sender.value)
    displayColors()
    }

    @IBOutlet weak var greenSlider: UISlider!
    @IBAction func greenValueChanged(sender: UISlider) {
    var green = CGFloat(sender.value)
    displayColors()
    }

    @IBOutlet weak var blueSlider: UISlider!
    @IBAction func blueValueChanged(sender: UISlider) {
    var blue = CGFloat(sender.value)
    displayColors()
    }



    func displayColors(){
        let red = CGFloat(redSlider.value)
        let blue = CGFloat(blueSlider.value)
        let green = CGFloat(greenSlider.value)
        let color = UIColor(
            red: red,
            green: green,
            blue: blue,
            alpha: 1.0)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        colorView.backgroundColor = UIColor(red: redSlider.value, green: greenSlider.value, blue: blueSlider.value, alpha: 1.0)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

但是,我在以下一行收到错误:

colorView.backgroundColor = UIColor(red: redSlider.value, green: greenSlider.value, blue: blueSlider.value, alpha: 1.0)

错误是:

  

无法将“Float”类型的值转换为预期的参数类型   'CGFloat的'

我知道有一个非常简单的解决方案,但是,因为我是一个菜鸟,我无法提出解决方案。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:7)

CGFloatFloat在技术上属于不同类型。 Swift编程语言不进行任何数值类型转换/强制。因此,您必须使用Float上的一个构造函数明确地从CGFloat转换为CGFloat

colorView.backgroundColor = UIColor(red: CGFloat(redSlider.value), green: CGFloat(greenSlider.value), blue: CGFloat(blueSlider.value), alpha: 1.0)

您可以在Numeric Type Conversion中详细了解The Swift Programming Language

答案 1 :(得分:5)

您收到此错误,因为xxxSlider.value的类型为Float,而UIColor初始化程序会为所有四个参数调用类型CGFloat

您可以通过将行更改为:

来兑换此错误
colorView.backgroundColor = UIColor(red: CGFloat(redSlider.value), green: CGFloat(greenSlider.value), blue: CGFloat(blueSlider.value), alpha: 1.0)

但是,要实现计划的目标,还有许多问题需要解决。我将在下面介绍这些内容。

首先,您有一个@IBAction以及一个@IBOutlet连接到每个滑块。对于前者(行动),后者实际上并不需要。因此,删除@IBOutlet连接(代码和连接)

@IBOutlet weak var redSlider: UISlider! // remove (also remove connection)
@IBOutlet weak var greenSlider: UISlider! // ...
@IBOutlet weak var blueSlider: UISlider! // ...

现在,在@IBAction:s中,您定义了一个从未使用的局部变量

var red = CGFloat(sender.value) // in @IBAction func redValueChanged(...
var green = CGFloat(sender.value) // ...
var blue = CGFloat(sender.value) // ...

在目前的形式中,您不需要这些,所以也要删除它们。

相反,在类的范围内(参见下面的完整程序),声明三个类变量来保存每个幻灯片的当前值(注意:这些不是类方法中定义的) /动作/功能)。此外,让这些类型为CGFloat而不是Float,因为我们用来更改背景颜色的UIColor的初始化程序会使用CGFloat类型的参数:

var redValue: CGFloat = 0.5 // 0.5: middle slider (init)
var greenValue: CGFloat = 0.5
var blueValue: CGFloat = 0.5

@IBAction闭包中,按sender.value(包含滑块值)更改这些类变量。更新变量值后,请调用displayColors()方法(稍后我们会查看)。

// Actions
@IBAction func redValueChanged(sender: UISlider) {
    redValue = CGFloat(sender.value)
    displayColors()
}

@IBAction func greenValueChanged(sender: UISlider) {
    greenValue = CGFloat(sender.value)
    displayColors()
}

@IBAction func blueValueChanged(sender: UISlider) {
    blueValue = CGFloat(sender.value)
    displayColors()
}

您的displayColors()可以简化为:

func displayColors() {
    colorView.backgroundColor = UIColor(red: redValue, green: greenValue, blue: blueValue, alpha: 1.0)
}

最后,并不是在加载ViewController时只调用一次重写方法viewDidLoad(),因此在这种情况下,您可以将其视为ViewController的初始化器。我们唯一想做的就是设置默认颜色:RGB(0.5,0.5,0.5)=灰色。

override func viewDidLoad() {
    super.viewDidLoad()

    // Initial BG color (viewDidLoad() loads only once when ViewController view loads)
    colorView.backgroundColor = UIColor(red: redValue, green: greenValue, blue: blueValue, alpha: 1.0)
}

我们已经完成了!

将它包装起来,您的ViewController类现在应该如下所示

import UIKit

class ViewController: UIViewController {

    // Properties
    var redValue: CGFloat = 0.5
    var greenValue: CGFloat = 0.5
    var blueValue: CGFloat = 0.5

    @IBOutlet weak var colorView: UIView!

    // Actions
    @IBAction func redValueChanged(sender: UISlider) {
        redValue = CGFloat(sender.value)
        displayColors()
    }

    @IBAction func greenValueChanged(sender: UISlider) {
        greenValue = CGFloat(sender.value)
        displayColors()
    }

    @IBAction func blueValueChanged(sender: UISlider) {
        blueValue = CGFloat(sender.value)
        displayColors()
    }


    func displayColors() {
        colorView.backgroundColor = UIColor(red: redValue, green: greenValue, blue: blueValue, alpha: 1.0)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // Initial BG color (viewDidLoad() loads only once when ViewController view loads)
        colorView.backgroundColor = UIColor(red: redValue, green: greenValue, blue: blueValue, alpha: 1.0)
    }
}

运行您的应用会产生以下行为:

enter image description here

答案 2 :(得分:0)

在我使用Swift 4的应用程序中,我使用它将Float转换为CGFloat:

let slider = sender as? UISlider
let val = CGFloat((slider?.value)!)

然后根据需要使用变量val,在我的情况下是色调,饱和度和亮度,例如

coolButton.saturation = val