我在将可选值附加到Swift中的数组时遇到问题。我正在写的视图是为健身房创建例程的。但是,我的Routine对象没有被实例化。

我有其他编程语言的经验,但是我对Swift和Optionals还是很陌生。

我的ViewController包含一个可选变量:

var routine: Routine?

Routine类包含以下内容:
name: String
exerciseList: [String]()
numOfSets: [Int]()

当我准备将新创建的例程发送到其他ViewController时,我从用户输入中获取值来编辑对象的字段。
let name = routineName.text ?? ""
let numberOne = Int(numOfSetsOne.text ?? "0") //numOfSetsOne is a text label
routine?.exerciseList.append(selectedExerciseOne!) //Haven't tested to see if this works yet
routine?.numOfSets[0] = numberOne! //This line is not working
routine = Routine(name: name)

为了进行一些调试,我将打印语句放在行的两边,如下所示:
print ("numberOne Value: \(numberOne!)")
routine?.numOfSets[0] = numberOne!
print ("numOfSets[0] Value: \(routine?.numOfSets[0])")

我希望第二个print语句的输出与第一个相同。但是终端输出:
numberOne Value: 3
numOfSets[0] Value: nil

有人知道这里出了什么问题吗?
谢谢

最佳答案

您已经声明了可能包含Routine的属性,但是在尝试使用该属性之前,尚未将Routine实例分配给该属性。

例如,这意味着

routine?.numSets[0] = numberOne!

什么都不做-routinenil,因此该语句被跳过。

您应该为init类创建一个适当的Routine函数,并使用该函数创建一个新的Routine并将其分配给routine
例如:
class Routine {
    var name: String
    var exerciseList = [String]()
    var numberOfSets = [Int]()

    init(named: String) {
        self.name = named
    }
}

那你可以说
let name = routineName.text ?? ""
let numberOne = Int(numOfSetsOne.text ?? "0")
self.routine = Routine(named: name)
self.routine?.numberOfSets.append(numberOne!)

协调相关的数组可能会有些混乱,因此我将使用单个数组:
struct ExerciseSet {
    let exerciseName: String
    let sets: Int
}


class Routine {
    var name: String
    var exerciseList = [ExerciseSet]()

    init(named: String) {
        self.name = named
    }
}

关于ios - 如何在Swift中向数组添加可选值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55631661/

10-13 04:15