2015-09-06 87 views
3

我正在学习iOS开发,并且在尝试操作元组数组时遇到了一个问题。不能用类型为(String,Int)的索引来下标类型为[(String,Int)]的值Swift 2

我得到以下错误消息:

无法下标类型的 '[(字符串,整数)]' 与类型的索引 '(字符串,整数)'

的值码生成的情况如下:

justStrings.append(filteredRestraunts[i2].0) 

作为一个整体的功能是这样的:

func filterBySliderValue() -> [String] { 
    var filteredRestraunts: [(String, Int)] 
    for var i = 0; i < restraunts.count; i++ { 
     if restraunts[i].1 > Int(starSlider.value) { 
      filteredRestraunts.append(restraunts[i]) 
     } 
     else {filteredRestraunts.append(("", 1))} 
    } 
    var justStrings: [String] 
    var i2 = 0 
    for i2 in filteredRestraunts { 
     justStrings.append(filteredRestraunts[i2].0) 
    } 
    return justStrings 
} 

这是阵列restraunts:

var restraunts: [(String, Int)] = [("Dallas BBQ", 3), ("Chicken Express", 4), ("Starbucks", 5)] 

预先感谢。

回答

3

for i2 in filteredRestraunts { 
    justStrings.append(filteredRestraunts[i2].0) 
} 

i2不是索引,但阵列元件,即 超过迭代它是一个(String, Int)元组。你大概意思是

for i2 in filteredRestraunts { 
    justStrings.append(i2.0) 
} 

补充说明:

  • 变量

    var i2 = 0 
    

    完全不使用,i2在for循环是一个新的变量,其范围是 限于循环。

  • 变量filteredRestrauntsjustStrings 未初始化,所以这应该会导致其他编译器错误。

  • 两个循环可以通过使用 filtermap一个功能更强大的方法来取代:

    let filteredRestraunts = restraunts.filter { $0.1 > Int(starSlider.value) } 
    let justStrings = filteredRestraunts.map { $0.0 } 
    

    当然也可以合并到

    let justStrings = restraunts.filter { $0.1 > Int(starSlider.value) }.map { $0.0 } 
    
+0

感谢您的帮助。我修复了范围警告,并初始化(并立即清空)数组,现在应用程序可以正常工作。我之前已经看到过使用地图和过滤器函数,但仍然不知道它们是如何工作的(甚至不知道如何使用它们)。再次感谢帮助,我整个星期都遇到了这个错误。 –

相关问题