2017-06-01 58 views
-2
var firstArray = ["1.","2.","3.","4."] 

var secondArray = ["a","b","c"] 

func combineTheArrays(array1: [Any], array2: [Any]) -> [Any] { 

    var finalArray = [Any]() 

    let maxIndex = array1.count >= array2.count ? array1.count : array2.count; 

    for i in 0...maxIndex{ 
     if (array1.count > i){ 
      finalArray.append(array1[i]) 
     } 
     if (array2.count > i){ 
      finalArray.append(array2[i]) 
     } 
    } } 

combineTheArrays(array1: firstArray, array2: secondArray) 

print(finalArray) 

我想拿两个不同/相似类型的数组,并让它通过函数工作并组合成一个单一的数组。这个功能的理想结果是打印:使用未解析标识符'finalArray'?

finalArray = ["1.", "a", "2.", "b", "3.", "c", "4."] 
+4

finalArray是函数中的局部变量。还应该有一个“缺少函数返回”错误... –

+0

(与您的具体问题无关,但请参阅https://stackoverflow.com/questions/34951824/how-can-i-interleave-two-arrays for ) –

+0

只需使用'zip'和'flatmap'就可以简化这段代码:'zip(array1,array2).flatMap {[$ 0,$ 1]}' – Alexander

回答

0

你非常接近!你只需要在你的函数定义的最后返回finalArray,然后分配函数调用的结果,这样就可以使用它(比如在print调用):

let finalArray = combineTheArrays(array1: firstArray, array2: secondArray) 

print(finalArray) 

你也应该使用泛型来确保您可以处理任何类型的元素,只要它们的类型相同即可。不像返回Any,你的结果将是一个相同类型的数组,这将更安全,更容易处理。以下是我将如何改进此代码:

func combineTheArrays<T>(array1: [T], array2: [T]) -> [T] { 

    let maxIndex = max(array1.count, array2.count); 

    var finalArray = [T]() 
    finalArray.reserveCapacity(array1.count + array2.count) 

    for i in 0..<maxIndex { 
     if i < array1.count { finalArray.append(array1[i]) } 
     if i < array2.count { finalArray.append(array2[i]) } 
    } 

    return finalArray 
} 

var firstArray = ["1.","2.","3.","4."] 
var secondArray = ["a","b","c"] 
let finalArray = combineTheArrays(array1: firstArray, array2: secondArray) 

print(finalArray) 
+0

非常感谢你,我花了整整两个小时尝试不同的方式,看我如何才能打印出来。我有一个问题,但如果你可以回答,为什么我需要使finalArray常量,如果我已经在函数中使它变量? –

+0

因为该函数中的变量与外界完全无关。这是一个局部变量,只存在于函数的生命周期中。它是在函数被调用时创建的,并且在函数完成时被破坏。 – Alexander

+0

换句话说,'let finalArray'被称为'finalArray'只是巧合,它与函数的'var finalArray'局部变量无关。 – Alexander