将数组声明为类的属性,并在Swift中使用它

时间:2018-11-19 19:52:58

标签: ios swift xcode

我有一个烹饪应用程序,其中有带有名字的饭菜和烹饪步骤,以字符串形式显示:

class Meal {    
    var name: String
    var steps: Array<String>?
}

然后我尝试将数据传递给查看:

override func viewDidLoad() { 
    super.viewDidLoad()

    // Handle the text field’s user input through delegate callbacks.
    nameTextField.delegate = self

    // Set up views if editing an existing Meal.
    if let meal = meal {
        nameTextField.text = meal.name
    }
    createLabelAndText()
}

createLabelAndText方法应为数组label的每个元素创建-类似于步骤1,步骤2和textView

  func createLabel() {

        for (index, element) in (meal?.steps){
            let myLabel = UILabel()

            //Assigning value or text to label
            myLabel.text = "Step \(index)"

            //Assigning frame to the label
            myLabel.frame = CGRect(x: 10, y: index*100, width: 200, height: 30)

            let textView = UITextView()
            textView.text = element
            textView.frame = CGRect(x: 10, y: index*100, width: 200, height: 30)

            //Finally we need to add label to view to display it on screen.
            self.view.addSubview(myLabel)
            self.view.addSubview(textView)
        }
    }

我想要得到的是这样的: [http://a1.mzstatic.com/us/r30/Purple30/v4/24/3e/64/243e64b5-79cf-9a35-5386-d81ed250b926/screen696x696.jpeg][1]

现在我有一个问题-我无法循环通过槽meal?.steps并收到错误Type '[Any]?' does not conform to protocol 'Sequence'

我还尝试在呈现视图控制器之前对其进行配置。但这不允许我访问和分配课堂上的步骤。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    super.prepare(for: segue, sender: sender)
    let name = nameTextField.text ?? ""
    let steps = meal?.steps
    // Set the meal to be passed to MealTableViewController after the unwind segue.
    meal = Meal(name: name, steps: steps )

}

我该如何解决这个问题,或者也许有一些更好的方法?

1 个答案:

答案 0 :(得分:2)

您需要解开steps,因为meal不仅是可选的,而且steps也是如此。例如

func createLabel() {
    guard let steps = meal?.steps else { return }

    for (index, element) in steps.enumerated() {
        let label = UILabel()

        //Assigning value or text to label
        label.text = "Step \(index)"

        //Assigning frame to the label
        label.frame = CGRect(x: 10, y: index*100, width: 200, height: 30)

        let textView = UITextView()
        textView.text = element
        textView.frame = CGRect(x: 10, y: index*100, width: 200, height: 30)

        //Finally we need to add label to view to display it on screen.
        view.addSubview(label)
        view.addSubview(textView)
    }
}

很显然,如果您想在通过index枚举时使用steps,则也需要使用enumerated()

顺便说一句,我不确定为什么要将文本视图设置为与标签具有相同的frame,将其有效地置于标签之上,但这超出了此问题的范围。这里的主要问题是确保在尝试使用steps可选内容之前先对其进行包装。