2016-08-09 86 views
0
extension Array { 

    mutating func fiveHundred() { 

     var arrCopy = self 
     arrCopy = arrCopy.reverse() 

     if arrCopy.count > 0 { 
      for i in 1..<250 { 

       print(arrCopy[i]) 
       self.append(arrCopy[i]) 
      } 
     } else { 
      print("Array is empty") 
     } 
    } 
} 

的最新数据时,它提供错误获取与阵列扩展

使用它的阵列上“无法将类型的值‘()’,以指定类型‘[双]’”

例如:

var data: [Int] = [1, 2, 3, 4, ..... all the way to 1000] 

data.fiveHundred() // Gives error 

编辑:看到它有< 250.对不起!我在另一个有250多个条目的数据数组上使用它。

假设这个数据数组有250多个数据。

EDIT2:下面是实际的代码

struct Data { 
    let array: [Double] = [1.0, 2.0, 3.0, 4.0] 
} 



printData(Data.array.fiveHundred) // The function printData(val: [Double]) 

EDIT3:我的道歉。这些例子和问题非常混乱。

extension Array where Element: Equatable { 

    mutating func fiveHundred() -> [Element] { 

     var arrCopy = self 
     arrCopy = arrCopy.reverse() 

     if arrCopy.count > 0 { 
      for i in 1..<250 { 

       print(arrCopy[i]) 
       self.append(arrCopy[i]) 
      } 
     } else { 
      print("Array is empty") 
     } 
    } 
} 

这解决了我的一部分问题。另一个问题是我只需要最多250个数据。目前它的1000.

我想使用data.fiveHundred()获得只有250数据。

EDIT4: 我终于解决了它。我感谢所有的帮助。

扩展Array中元素:Equatable {

mutating func fiveHundred() -> [Element] { 

    var tempArr: [Element] = [] 

    for i in (count-1500)..<count { 

     tempArr.append(self[i]) 
    } 
    return tempArr 
} 

}

给我正确的数组。抱歉让人困惑。因为你的阵列是out of indexarrCopy[3]错误开始250

后,下一次,我必须与我的问题和说明有关问题的

+0

@Hamish使用期望一个函数[双]我有一个我使用fiveHundred()的双数组。 – bCM

+0

@Hamish我应该修改fiveHundred返回[双]?事情是我有不同类型的数组,如[Int]或[String] ... – bCM

+0

您应该使用var。检查我的回答 –

回答

1

print(arrCopy[i])更加明确给出了一个错误,你可以辞退与% arrCopy.count

错误
extension Array { 

    mutating func fiveHundred() { 

     var arrCopy = self 
     arrCopy = arrCopy.reverse() 

     if arrCopy.count > 0 { 
      for i in 1..<250 { 

       ///print(arrCopy[i]) 
       self.append(arrCopy[i%arrCopy.count]) 
      } 
     } else { 
      print("Array is empty") 
     } 
    } 
} 
+0

感谢您的回答。看看编辑的问题细节。 – bCM

1

我真的不明白你想达到什么目的。但是,如果我充分认识到,你需要追加反阵,不超过250元,不包括第一个元素,那么这里就是解决方案:

extension Array { 
    mutating func fiveHundred() { 

     var arrCopy = self 
     arrCopy = arrCopy.reverse() 

     if arrCopy.count > 0 { 
      let endIndex = arrCopy.count > 250 ? 250 : arrCopy.count 
      let subArrCopy = arrCopy[1..<endIndex] 
      self.appendContentsOf(subArrCopy) 
     } else { 
      print("Array is empty") 
     } 
    } 
} 

当然这种扩展将与let工作只与var iables,不 - 常量:

var data: [Double] = [1.0, 2.0, 3.0, 4.0] 
data.fiveHundred() //ok 
print(data) 
//[1.0, 2.0, 3.0, 4.0, 3.0, 2.0, 1.0] 
print(data.fiveHundred()) 
//() - because fiveHundred() is void function, it only mutate your array returning void 
print(data) 
//[1.0, 2.0, 3.0, 4.0, 3.0, 2.0, 1.0, 2.0, 3.0, 4.0, 3.0, 2.0, 1.0] - fiveHundred() mutated data in previous print call 

let data: [Double] = [1.0, 2.0, 3.0, 4.0] 
data.fiveHundred() //error 
+1

一些改进:'var arrCopy = self'将'arrCopy'设置为'self'的一个副本,但是它会立即在'arrCopy.reverse()'的下一行代替。如果条件可能更适合作为后卫。另外,使用“max”钳制到250会更清晰 – Alexander

0

这里有Shadow Of's answer的改进:

extension Array { 
    mutating func fiveHundred() { 
     guard self.count > 0 else { 
      print("Array is empty") 
      return 
     } 

     let endIndex = min(self.count, 250) 
     self += self.reverse()[1..<endIndex] 
    } 
} 
+0

嗨,我认为'max'应该是'min'。你需要定义'arrCopy'。 –

+0

@appzYourLife早安:)你能告诉我还没有喝过咖啡吗? :) – Alexander

+0

Ty代码修订;随时编辑我的帖子,如果你愿意 –