Swift 3 - 包装数组的功能

时间:2018-02-04 19:34:29

标签: arrays swift3 swift-playground func

当我尝试学习Swift 3时,我正试图"包裹一个元素阵列"。在Swift 3 Playgrounds中,我能够实现包装数组的代码。当我尝试创建一个实现我的代码的函数时,我的问题出现了。

如果您使用以下代码并将其复制粘贴到Swift 3 Playground,那么您可能会看到我正在尝试做的事情。更改selectedElement,在右侧您将看到正确的newArray。您可以为selectedElement交换不同的元素,newArray也会相应地更改。

我注意到我将其转变为功能的失败尝试之一。

    //Looks for single or multiple taps.
    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(ViewController.dismissKeyboard))
    //Uncomment the line below if you want the tap not not interfere and cancel other interactions.
    tap.cancelsTouchesInView = false
    view.addGestureRecognizer(tap)

2 个答案:

答案 0 :(得分:0)

你的方法运行正常。 我看到的唯一问题是您正在尝试访问函数范围之外的函数内创建的变量。

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

arrayWrapper(inputArray: myArray)

答案 1 :(得分:0)

嗯,这个问题的非功能解决方案需要两个输入 - 你要包装的数组,以及你想要它包装的元素。因此,您的函数也应该有两个参数:

// 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)