【问题标题】:Swift 3 - Function for Wrapping an ArraySwift 3 - 用于包装数组的函数
【发布时间】: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

【问题讨论】:

    标签: arrays swift3 swift-playground func


    【解决方案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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-25
        • 1970-01-01
        • 2017-02-09
        • 1970-01-01
        • 1970-01-01
        • 2014-05-30
        • 1970-01-01
        相关资源
        最近更新 更多