Swift 3 - 包装数组的函数

Swift 3 - Function for Wrapping an Array

当我尝试学习 Swift 3 时,我正在尝试 "Wrap an Array of Elements"。在 Swift 3 Playgrounds 中,我能够实现包装数组的代码。当我尝试创建一个实现我的代码的函数时出现问题。

如果您将以下代码复制并粘贴到 Swift 3 Playground,那么您可能会明白我正在尝试做什么。更改 selectedElement,您将在右侧看到正确的 newArray。您可以互换 selectedElement 的不同元素,newArray 将相应更改。

我记下了我将其转换为函数的一次失败尝试。

import UIKit

let myArray = ["a", "b", "c", "d", "e"] 
let selectedElement = "a"


//func arrayWrapper(inputArray: Array<String>) -> Array<String> {

    var oldArray = [String]()
    var priorElements = [String]()
    var newArray = [String]()

    for element in myArray {
        if element == selectedElement || oldArray.count > 0 {
            oldArray.append(element)
        } else {
            priorElements.append(element)
        }
        newArray = oldArray + priorElements
    }
    //return newArray
//}

priorElements
oldArray

oldArray + priorElements

newArray

你的方法很有效。 我看到的唯一问题是您试图访问在函数范围之外的函数内部创建的变量。

//priorElements
//oldArray
//
//oldArray + priorElements

arrayWrapper(inputArray: myArray)

好吧,您对这个问题的非函数解决方案需要两个输入 - 您要包装的数组和您要包装的元素。因此,您的函数也应该有两个参数:

// note the second parameter
func arrayWrapper(inputArray: Array<String>, selectedElemented: String) -> Array<String> {

    var oldArray = [String]()
    var priorElements = [String]()
    var newArray = [String]()

    for element in myArray {
        if element == selectedElement || oldArray.count > 0 {
            oldArray.append(element)
        } else {
            priorElements.append(element)
        }
        newArray = oldArray + priorElements
    }
    return newArray
}

这是此函数的更通用版本,作为 Array 的扩展:

extension Array where Element : Equatable {
    func wrap(around selectedElement: Element) -> Array<Element> {

        var oldArray = [Element]()
        var priorElements = [Element]()
        var newArray = [Element]()

        for element in self {
            if element == selectedElement || oldArray.count > 0 {
                oldArray.append(element)
            } else {
                priorElements.append(element)
            }
            newArray = oldArray + priorElements
        }
        return newArray
    }
}

// usage
myArray.wrap(around: selectedElement)