【问题标题】:Cannot convert value of type 'Float' to expected argument 'CGFloat'无法将“Float”类型的值转换为预期的参数“CGFloat”
【发布时间】:2015-12-25 00:41:04
【问题描述】:

我已经搜索了一段时间的答案。 一般来说,在编码方面,我绝对是个菜鸟,但我想我会尝试一下。 我正在尝试编写一些代码来使用 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)

错误是:

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

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

任何帮助将不胜感激。

【问题讨论】:

  • CGFloat(redSlider.value)

标签: ios swift


【解决方案1】:

CGFloatFloat 在技术上是不同的类型。 Swift 编程语言不做任何数字类型转换/强制。因此,您必须使用CGFloat 上的构造函数之一从Float 显式转换为CGFloat

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

您可以在The Swift Programming Language 中阅读有关Numeric Type Conversion 的更多信息。

【讨论】:

  • 这样做会让我的 colorView 消失
  • 这与您的问题(类型转换)不同。您是否在调试器中检查过您的值? UIColor 初始化程序预期的绿色/蓝色/红色参数是 0.0 - 1.0 之间的值。
【解决方案2】:

您会收到此错误,因为 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)
}

最后,并不是说被覆盖的方法viewDidLoad() 只在加载 ViewController 时调用一次,所以在这种情况下,您可以将其视为 ViewController 的初始化程序。我们在这里唯一要做的就是设置默认颜色:RGB(0.5, 0.5, 0.5) = gray。

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)
    }
}

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

【讨论】:

  • 很抱歉问了这么一个愚蠢的问题,但是,“init”去哪里了?
  • 不用担心。我将编辑我的答案,告诉你必须实现你的结果,而不是你的代码有什么问题(因为目前有几件事不太正确)
  • 非常感谢.....这是过去几天我得到的最好答案......
  • @PaulGrapeDrinkVagner 欢迎您。祝你的 Swift 之旅好运!
【解决方案3】:

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

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

然后根据需要使用变量 val,在我的例子中是用于色调、饱和度和亮度,例如

coolButton.saturation = val

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 2016-03-21
    相关资源
    最近更新 更多