【问题标题】:Create object ( var name: [NSArray] ) from list of words从单词列表创建对象( var name: [NSArray] )
【发布时间】:2018-08-10 19:01:11
【问题描述】:

我有一个简单的单词测试列表,例如:

土豚 熊 猫 狗 大象 长颈鹿

我想把它变成一个对象,格式如下:

var array: [NSArray]  = [["Aardvark", false, 0], ["Bear", false, 1],["Cat", false, 2], ["Dog", false, 3], ["Elephant", false, 4], ["Giraffe", false, 5]]

所以第一个元素总是列表中的单词,第二个元素总是假的,第三个元素总是索引

我该怎么做?

【问题讨论】:

  • 你应该为此设计一个合适的数据模型。不要依赖数组数组
  • [NSArray] 是这个问题的一个特别可怕的类型。它既类型不安全,又极难使用。你想在这里创建一个struct 并创建一个数组。然后这变得更容易创建和使用。如果你能描述你正在解决的问题,我相信我们可以向你展示如何创建结构。在这种情况下,什么是“假”?
  • 啊,好吧。 “False”是列表中的项目是否已被选中。 False = 未选中,所以所有以 True = selected 开头的都是 false(当用户选择 tableview 单元格时)
  • Aardvark Bear Cat Dog Elephant Giraffe 你的字符串中有这个值吗?

标签: arrays swift object append swift4


【解决方案1】:

您可以将数据存储在struct 例如:

/// Test Elements
struct TestInfo {

var animalName: String
var trueOrFalse: Bool
var index: Int

}

在您的 ViewController 中,您将创建一个数组来存储这些:

  //Array To Store The Test Elements
  var testArray = [TestInfo]()

因此可以像这样填充您的数据:

   override func viewDidLoad() { super.viewDidLoad()

    //1. Create The Test Info
    let setOne = TestInfo(animalName: "Aardvark", trueOrFalse: false, index: 0)
    let setTwo = TestInfo(animalName: "Bear", trueOrFalse: false, index: 1)
    let setThree = TestInfo(animalName: "Cat", trueOrFalse: false, index: 2)
    let setFour = TestInfo(animalName: "Dog", trueOrFalse: false, index: 3)
    let setFive = TestInfo(animalName: "Elephant", trueOrFalse: false, index: 4)
    let setSix = TestInfo(animalName: "Giraffe", trueOrFalse: false, index: 5)

    //2. Add It To The Test Array
    testArray.append(setOne)
    testArray.append(setTwo)
    testArray.append(setThree)
    testArray.append(setFour)
    testArray.append(setFive)
    testArray.append(setSix)

    //3. Retrieve Values & Log The Results
    let name = testArray[0].animalName
    let trueOrFalse = testArray[0].trueOrFalse
    let index = testArray[0].index

    print("""
        1st Animal Name = \(name)
        1st Animal True Or False Value = \(trueOrFalse)
        1st Animal Index = \(index)
        """)
}

这应该让你开始......

【讨论】:

    【解决方案2】:

    结构中的数字似乎与数组索引相对应,这可能使它们变得多余。并且将所选状态存储在接近实际数据的位置可能不是正确的方法 - 名称数组是您的数据,而所选状态是该数据表示的一部分。

    出于这个原因,您可能会考虑将您的数组缩减为一个简单的字符串数组并添加一组索引,如下所示:

    var selectedItems = Set<Int>()
    

    要选择一个项目,您只需将其索引添加到集合中:

    selectedItems.insert(index)
    

    要取消选择项目,您将从集合中删除其索引:

    selectedItems.remove(index)
    

    套装是一个不错的选择,因为您不能多次添加一个项目。

    【讨论】:

      【解决方案3】:

      我会这样做,与Josh Robbins 答案略有不同。

      struct TestInfo {
         var name :  String
         var trueOrFalse : Bool
         var index : Int
      }
      

      .

      var array: [TestInfo]  = []
          var animalNames = ["Dog","Cat","Bear","Aatdvark","Duck","Elephant"]
          for (index,eachAnimal) in animalNames.enumerated() {
              let element = TestInfo(name: eachAnimal, trueOrFalse: false, index: index)
              array.append(element)
          }
           print(array)
      

      【讨论】:

      • 一种更简洁的方法 :) 虽然我只是展示了如何开始 :)
      猜你喜欢
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2015-07-26
      • 2013-01-12
      • 2020-06-17
      • 1970-01-01
      • 2011-09-07
      • 2023-03-18
      相关资源
      最近更新 更多