2017-06-01 60 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