一个带有闭包属性的结构数组,它将接受并修改UILabel

时间:2017-02-08 04:01:08

标签: arrays swift uilabel closures

我正在尝试创建一个UIPickerView,它包含描述字符串的行,用于描述UILabel会发生什么。选择一行& UILabel属性更改发生在UILabel上。我希望创建一个具有String和闭包属性的结构,闭包接受并返回UILabel。然后,我将创建这些结构的数组,使用不同的字符串填充各种数组元素,并在拾取行时执行相应的闭包。我的猜测是我没有正确思考如何设置或调用闭包。我一直希望能传递这样的东西:

label = wheelArray [row] .rowFormula(label)

这是我的代码,直到我设置wheelArray的错误:     导入UIKit

class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var pickerControl: UIPickerView!

    struct WheelStruct {
        var rowText: String
        var rowFormula: (UILabel) -> UILabel
    }

var wheelArray = [WheelStruct(rowText: "Font Size = 20", rowFormula: {$0.font.withSize(20)}),
                  WheelStruct(rowText: "Font Size = 30", rowFormula: {$0.font.withSize(30)})]

我遇到的错误:var wheelArray ...是: “无法将'UIFont类型的值转换为闭包结果类型'UILabel' 我的印象是我可以将UILabel作为$ 0传递,并且方法应用的更改只会返回修改后的UILabel。 我已经编写了类似于此的代码,其中更基本的闭包可以在结构上执行简单的Double计算:( Double) - > Double,元素初始化为{$ 0 * 1.6}。 衷心感谢任何能够直接对此进行思考的人。

1 个答案:

答案 0 :(得分:1)

  

直截了当地设定我的想法

这非常简单。 {$0.font.withSize(20)}会返回字体 - 一个UIFont。但是你声明rowFormula是一个返回UILabel的函数。这是不匹配的。

  

将接受并修改UILabel

这是一个显而易见的方法。返回字体和返回标签都没有任何意义。相反,使rowFormula不返回任何内容 - 即声明它返回Void。现在更改你的实际功能,使它设置 $0.font - 即它改变传递给它的UILabel的字体。

所以,举例来说,只是为了给你一个提示,你的匿名函数就会这样开始:{$0.font = ...(把剩下的部分留作读者的练习!)