【问题标题】:Accessing an element from a tuple NSArray从元组 NSArray 访问元素
【发布时间】:2017-05-31 08:39:29
【问题描述】:

我正在 swift 3.0 中开发一个项目,其中我有一个元组数组来存储一组数据。保存它们后,我将此元组数组转换为 NSArray 并使用另一个函数对该数组中的元素(对象)进行混洗。我的要求是访问这个重新调整的数组(NSArray)中的元素。我的代码如下(请阅读 cmets 以获得更好的理解)。

这是我将数据保存到我的元组数组的地方

 var savedSongsArray:[(title:String,healerName:String,trackUrl:URL,imageUrl: String)] = []

func getAllTracksFromSavedPath(){
        for i in 0 ..< trackIdsArray.count{

             savedSongsArray.append((title: songDetailsArray[i].title , healerName:songDetailsArray[i].healerName, trackUrl: uRL, imageUrl: songDetailsArray[i].imageUrl))
            //savedSongsArray is my tuple array
        }

    let arrayToBeShuffled = savedSongsArray as NSArray // This is where I convert it to a NSArray
}

我的随机播放功能

    func shuffledSongsArray(array:NSArray) -> NSArray {
    let mutableArray = array.mutableCopy() as! NSMutableArray
    let count = mutableArray.count
    if count>1 {
        for i in ((0 + 1)...count-1).reversed(){
            mutableArray.exchangeObject(at: i, withObjectAt: Int(arc4random_uniform(UInt32(i+1))))
        }
    }

    return mutableArray as NSArray
}

一旦我打印出 mutableArray 的结果,如下所示

("indika - (index.jpeg)", "Steven Flemin", file:///Users/auxenta/Library/Developer/CoreSimulator/Devices/2B4EB1F8-FA38-4777-A274-10979F6EEB6F/data/Containers/Data/Application/CAB78797-8AB2-4DD9-8322-6F88B454BA74/Documents/5746821397741568.mp3, "https://storage.googleapis.com/feisty-beacon-159305.appspot.com/images.png")

如何访问这个元组 NSArray 中的各个元素??

【问题讨论】:

  • 您能不能解释一下您的要求,因为无法理解您的问题。
  • 如果你能看到我的代码底部,我已经粘贴了我洗牌数组后得到的结果。我的要求是访问这些元素中的每一个并分配给我在下面提到的属性
  • 你为什么在这里使用NSArray?您正在丢弃类型信息。您的改组功能最好放在MutableCollection 的扩展中,比较How do I shuffle an array in Swift?。此外,您可能希望使用实际的 struct 而不是数组中的元组。元组仅用于短期数据存储。
  • 对不起,我是 swift 新手,可以使用代码 sn-p 更具体

标签: swift nsarray


【解决方案1】:

首先,使用原生 Swift 结构体,即 Array 代替 NSArray 和 NSMutableArray。 您可以像这样访问命名元组的元素: let title = array[n].title,其中n 是您要访问的元组的索引,title 是您要获取的元组的命名元素。

这应该可行:

func shuffledSongsArray(array:[(title:String,healerName:String,trackUrl:URL,imageUrl: String)]) -> [(title:String,healerName:String,trackUrl:URL,imageUrl: String)] {
    let shuffledArray: [(title:String,healerName:String,trackUrl:URL,imageUrl: String)] = []
    //do the shuffling here
    return shuffledArray
}

let result = shuffledSongsArray(array: inputArray)
let firstHealerName = result[0].healerName

let firstHealerName = result[0].1 应该会给你同样的结果

【讨论】:

  • 如果这没有回答您的问题,请更详细地说明您想要达到的目标。
  • 这正是我想要实现的目标。但是从我的洗牌函数来看,它返回一个 NSArray。我打印的结果。现在,例如从该结果中,我怎样才能得到值“Steven Flemin”并将其分配给一个值?
  • 我已经为您的代码添加了示例。您应该能够弄清楚如何将您的代码转换为使用 Array 而不是 NSArray
  • 我说 result 没有名为 healerName 的成员。我认为问题是 shuffledSongsArray 返回一个 NSArray ,就像我在问题中的代码一样。我该如何解决这个问题
  • 然后尝试我给出的第二个选项。如果您按照我的建议使用 Array 而不是 NSArray 并返回一个命名元组,那么命名参数也可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-10
相关资源
最近更新 更多