如何在swift中实例化一个类数组?

时间:2015-02-07 12:38:48

标签: arrays class swift instantiation

嘿,当我宣布并创建了一个班级数组时,我遇到了问题。

我声明了一个像这样的数组

var _mScoringData = [ScoringData]()

这是'ScoringData'类

class ScoringData{
    let num : Int!
    let question : String!
    var yes : Bool!
    var no : Bool!    

    init(num:Int,question:String){
        self.num = num
        self.question = question
        self.no = false
        self.yes = false
    }
}

我创建了一个函数来创建一个实例数组,下面的代码是函数的实现

func createScoringDatas(){
    for var index = 0; index < scoreDataCount; ++index{
        _mScoringData.append(ScoringData(num:index,question: _mQuestionData.Questions[index]))
    }
}

构建很好,但是数组没有创建,当我调试时,堆上没有任何内容。 我想知道如何解决这个问题。

感谢。

2 个答案:

答案 0 :(得分:1)

没有完整的代码就无法判断,但原因很可能是因为你的变量scoreDataCount为零。如果我接受您的代码,并确保scoreDataCount非零,那么它可以正常工作。

scoreDataCount只是_mQuestionData.Questions中问题数量的计数吗?如果是这样,您可能需要考虑以下C风格for和数组下标的替代方法:

for (index, question) in enumerate(_mQuestionData.Questions) {
    _mScoringData.append(ScoringData(num: index, question: question))
}

enumerate(someSequence)接受一个序列(例如数组),并创建一个新的对序列,一个从零开始的索引,以及序列的元素。然后,您可以使用for…in来覆盖它,这看起来更清晰,并有助于避免错误(例如您遇到的错误)。

一旦你理解了这一点,那么从那里开始完全取消for循环并用map替换它只需很短的一步:

_mScoringData = map(enumerate(_mQuestionData.Questions)) { 
  index, question in
    ScoringData(num: index, question: question)
}

注意,这会创建一个地图,而不是附加到现有地图,因此您可能不再需要初始创建行。

每当你有一系列事情,并且你想要转换每个元素并将它放在一个数组中时,map就是这种情况。您可以争辩for…in更清楚(特别是如果您不习惯看map)但map的好处是它使您的意图完全明显 - 转换输入到新数组中。

这样做的另一个好处是,如果事实证明您在第一次创建后永远不需要更改它,现在可以使用_mScoringData而不是let声明var

P.S。在!中的所有成员变量之后,您可能不需要那些ScoringData。这些是创建隐式解包的选项,并且仅在非常特定的情况下才需要。您可能会在需要时在其他地方看到它们,但您不需要在每个成员变量上复制它。

答案 1 :(得分:0)

我不确定你为什么会看到你遇到的问题。我拿了代码并将其粘贴到游乐场中运行它并且工作正常。我正在粘贴下面代码的略微修改版本。我唯一的变化是声明scoreDataCount值并将问题的来源更改为字符串数组。

class ScoringData{
    let num : Int!
    let question : String!
    var yes : Bool!
    var no : Bool!

    init(num:Int,question:String){
        self.num = num
        self.question = question
        self.no = false
        self.yes = false
    }
}

    let scoreDataCount = 5
    var _mScoringData = [ScoringData]()

    let questions = ["One", "two", "three", "four", "five" ]


    func createScoringDatas() {
        for var index = 0; index < scoreDataCount; ++index{
            _mScoringData.append(ScoringData(num:index,question: questions[index]))
        }
    }


createScoringDatas()
print(_mScoringData.count)
print(_mScoringData[2].question)

最后2个打印语句输出5和&#34;三个&#34;分别是我所期望的。