Swift 3 - 用于包装数组的函数

Posted

技术标签:

【中文标题】Swift 3 - 用于包装数组的函数【英文标题】:Swift 3 - Function for Wrapping an Array 【发布时间】:2018-02-04 19:34:28 【问题描述】:

当我尝试学习 Swift 3 时,我正在尝试“包装元素数组”。在 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

【问题讨论】:

【参考方案1】:

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

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

arrayWrapper(inputArray: myArray)

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于Swift 3 - 用于包装数组的函数的主要内容,如果未能解决你的问题,请参考以下文章

C++3笔记

在 Swift 中使用以函数为参数的 C 函数

swift ImageFilter hold一个全局的图片处理注册器,可以注册一些图片处理函数。然后ImageFilter数据结构包装一个要处理的图片的信息,通过这个包装方便的对一个图片应用某个过滤器

Swift 3:如何将内容包装在具有多个标签的 tableviewcell 中?

使用ctypes python包装C函数返回未知大小的数组

Swift @propertyWrapper(属性包装)的使用和本质