2017-02-08 1 views
0

Я пытаюсь создать UIPickerView, в котором есть строки описательных строк, которые описывают, что произойдет с UILabel. Выберите строку &, что изменение свойства UILabel происходит с UILabel. Я надеялся создать структуру, которая имеет свойства String и закрытия, с закрытием, принимающим и возвращающим UILabel. Затем я создаю массив этих структур, заполняя различные элементы массива различными строками для параметров и выполняя соответствующее закрытие при выборе выбранной строки. Я предполагаю, что я не правильно задумываюсь о том, как настроить или вызвать закрытие. Я надеялся, что я могу передать что-то вроде этого:Массив структур с закрывающим свойством, который примет и изменит UILabel

метки = wheelArray [строка] .rowFormula (ярлык)

Здесь пока мой код до тех пор, когда я получаю установки ошибки вверх 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)})] 

Я получаю ошибку в строке: вар wheelArray ... это: «Невозможно преобразовать значение типа«UIFont в результате закрытия типа „UILabel“ я был под впечатлением, что я мог бы пройти в UILabel как $ 0, и что изменения, применяемые методами, просто вернут t он модифицировал UILabel. Я написал код, похожий на это, с более базовыми затворами, которые могли бы выполнять простые вычисления Double на struct: (Double) -> Double, с элементами, инициализированными как {$ 0 * 1.6}. Искренняя благодарность всем, кто может направить мое мышление прямо на это.

ответ

1

установить свое мышление прямо на этом

Это очень просто. {$0.font.withSize(20)} вернет шрифт - UIFont. Но вы заявили, что rowFormula - это функция, которая возвращает UILabel. Это несоответствие.

, который будет принимать и изменять UILabel

Вот очевидный подход. Ни возврат шрифта, ни возврат метки не имеют никакого смысла здесь. Вместо этого сделайте rowFormula ничего не возвращайте - т. Е. Объявите, что он возвращает Void. Теперь измените свою фактическую функцию так, чтобы она установила $0.font - т. Е. Изменяет шрифт UILabel, который ему передан.

Так, к примеру, просто чтобы дать вам подсказку, ваша анонимная функция запускается так: {$0.font = ... (Выяснение остальное остается в качестве упражнения для читателя!)

+0

Очень полезно. Поэтому я устанавливаю rowFormula: var rowFormula: (UILabel) ->(), а также, похоже, испортил инициализацию фактической структуры. Кажется, что это работает: {$ 0.font = $ 0.font.withSize (20)}. Спасибо за решение. Я действительно наслаждаюсь вашей книгой, кстати! – Gallaugher

+0

Спасибо! Я также хотел бы похвалить вас за подход Swifty к этому, с массивом структур, поддерживающих функции, соответствующие строкам. Очень хорошая идея. – matt

Смежные вопросы