2015-10-10 45 views
0

给定一个包含任意数量对象的数组,如何干净利落地将前三个元素存储到新数组中?如果数组不包含至少3个元素,则不应该触发运行时异常,而只应将数组中元素的数量添加到新数组中。将数组中的第一个元素存储在另一个数组中,如果它们存在

我想这可能会奏效,但它不会在Xcode 7编译,如果它没有我无法想象它会表现得安全地我的愿望:

let arr1 = [1, 2, 3, 4, 5] 
let arr2 = arr1[0..<3] 
//Expected: arr == [1, 2, 3] 

let arr1 = [1, 2] 
let arr2 = arr1[0..<3] 
//Expected: arr2 == [1, 2] 

let arr1 = [Int]() 
let arr2 = arr1[0..<3] 
//Expected: arr2 == [] 

当然,一个总是可以做像这样的东西,或者你可以使用for循环,但既不清晰又简洁。我想找一个更快捷的方式。

let arr1 = [1, 2] 
var arr2 = [Int]() 
if photos.count > 0 { 
    arr2.append(arr1[0]) 
} 
if photos.count > 1 { 
    arr2.append(arr1[1]) 
} 
if photos.count > 2 { 
    arr2.append(arr1[2]) 
} 

回答

3

我认为最简单的办法是

let arr2 = arr1.prefix(3) 
+0

什么范围,比如'3 .. <6'? –

+1

@AaronBrager原来的问题是关于前三个。 – MirekE

+0

适合我需要的东西,只是美丽的 – Joey

0

你可以实现你想要的东西与扩展Array

extension Array { 
    func safeRange(range : Range<Int>) -> ArraySlice<Element> { 
     guard range.startIndex >= 0 && range.endIndex >= 0 else { 
      fatalError("Ranges with negative numbers aren't supported") 
     } 

     var shrinkingRange = range 

     while shrinkingRange.endIndex > shrinkingRange.startIndex + 1 { 
      if shrinkingRange.endIndex <= self.count { 
       return self[shrinkingRange] 
      } 

      shrinkingRange.endIndex = shrinkingRange.endIndex - 1 
     } 

     return [] 
    } 
} 

你给行为的例子如预期:

let arr1 = [1, 2, 3, 4, 5] 
let arr2 = arr1.safeRange(0..<3) 
//Expected: arr == [1, 2, 3] 

let arr3 = [1, 2] 
let arr4 = arr3.safeRange(0..<3) 
//Expected: arr2 == [1, 2] 

let arr5 = [Int]() 
let arr6 = arr5.safeRange(0..<3) 
//Expected: arr2 == [] 

您还可以使用filter

extension CollectionType where Generator.Element : Equatable, Index == Int { 
    func safeRange(range : Range<Int>) -> [Self.Generator.Element] { 
     return self.filter { 
      let index = self.indexOf($0)! 
      return index >= range.startIndex && index < range.endIndex 
     } 
    } 
} 

(这可能,如果你的数组包含重复的元素,不能因为indexOf返回第一个实例的索引)

+0

这将是一个整洁的扩展周围!矫枉过正,满足我的特定需求,但对其他人来说非常有用。 – Joey

0

另一种方法是使用功能...

import Swift 

let arr1 = [1, 2, 3, 4, 5] 
let arr2 = [1, 2] 
let arr3 = [Int]() 

func firstThree(data: [Int]) -> [Int] { 
    var results = [Int]() 
    for (index, number) in data.enumerate() { 
     if (index < 3) { 
      results.append(number) 
     } 
    } 
    return results 
} 

print(firstThree(arr1)) 
print(firstThree(arr2)) 
print(firstThree(arr3)) 

此打印:

[1, 2, 3] 
[1, 2] 
[] 

稍微好一点的做法是使用仿制药并获得N个物品:

func genericFirstItems<T>(array: [T], numberOfItems: Int) -> [T] { 
    var results = [T]() 

    for (index, item) in array.enumerate() { 
     if index < numberOfItems { 
      results.append(item) 
     } 
    } 
    return results 
} 

print(genericFirstItems(arr1, numberOfItems: 3)) 
print(genericFirstItems(arr2, numberOfItems: 3)) 
print(genericFirstItems(arr3, numberOfItems: 3)) 

这有相同的输出。

[1, 2, 3] 
[1, 2] 
[] 
相关问题