从 Enum 中获取数据以显示在 UIPickerView 上

Take data from Enum to show on UIPickerView

我正在创建一个简单的视图,其中有一个 UIPickerView,我想从枚举中显示 PickerView 上的选项。我创建了一个可能的饮料枚举

enum drink{
  case coffee
  case tea
  case cola
  case water
}

我想知道如何在 UIPickerView 中显示饮料?我正在使用 Swift 1.2 和 Xcode 6.3.1.. 谢谢!! :)

给他们一个字符串并用 rawValue 调用它。

enum Drink: String {
    case Coffee = "Coffee"
    case Tea = "Tea"
    case Cola = "Cola"
    case Water = "Water"
}

println(Drink.Coffee.rawValue) // Prints "Coffee"

正如 ABakerSmith 在他的回答中提到的,您也可以使用 printable。在下一个示例中,它与 ABakerSmith 的方法相比略有不同。

enum Drink: String, Printable {
    case Coffee = "Coffee"
    case Tea = "Tea"
    case Cola = "Cola"
    case Water = "Water"

    var description: String { return rawValue }
}

println(Drink.Coffee) // Prints "Coffee"

正如 Leonardo Savio Dabus 提到的,简化版。

你可以像这样使用枚举;

enum drink: String{
    case coffee = "coffee"
    case tea = "tea"
    case cola = "cola"
    case water = "water" 
}

本例可以添加uipickerview;

http://makeapppie.com/tag/uipickerview-in-swift/

我会让 Drink 符合 Printable 协议:

Printable 协议如下所示:

protocol Printable {
    var description: String { get }
}

因此,您的 Drink 枚举将是:

enum Drink : Printable {
    case Coffee
    case Tea
    case Cola
    case Water

    var description: String {
        switch self {
            case .Coffee: return "Coffee"
            case .Tea   : return "Tea"
            case .Cola  : return "Cola"
            case .Water : return "Water"
        }
    }
}

下面是在 String 中使用 Drink 的示例:

let myDrink: Drink = .Tea
println("I'm drinking \(myDrink)") // I'm drinking Tea

ABakerSmith 所述,您可以使用可打印协议在 UIPickerView 中显示 String

最后你可以得到一个 ViewController 如下所示:

//
//  ViewController.swift
//  Test
//
//  Created by Stefan Veis Pennerup on 04/05/15.
//  Copyright (c) 2015 Kumuluzz. All rights reserved.
//

import UIKit

class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {

@IBOutlet weak var pickerView: UIPickerView!

enum Drink: Int, Printable {
    case Coffee = 0
    case Tea = 1
    case Cola = 2
    case Water = 3
    static var count: Int { return Drink.Water.rawValue + 1 }

    var description: String {
        switch self {
        case .Coffee: return "Coffee"
        case .Tea   : return "Tea"
        case .Cola  : return "Cola"
        case .Water : return "Water"
        default: return ""
        }
    }
}

// MARK: - UIPickerViewDataSource

func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
    return 1
}

func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return Drink.count
}

// MARK: - UIPickerViewDelegate

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
    return Drink(rawValue: row)?.description;
}

// several optional methods:

// func pickerView(pickerView: UIPickerView!, widthForComponent component: Int) -> CGFloat

// func pickerView(pickerView: UIPickerView!, rowHeightForComponent component: Int) -> CGFloat

// func pickerView(pickerView: UIPickerView!, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString!

// func pickerView(pickerView: UIPickerView!, viewForRow row: Int, forComponent component: Int, reusingView view: UIView!) -> UIView!

// func pickerView(pickerView: UIPickerView!, didSelectRow row: Int, inComponent component: Int)
}

Apple 在 Swift 4.2 / Xcode 10+ 中引入了 CaseIterable,这使得它更干净。

The compiler can automatically provide an implementation of the CaseIterable requirements for any enumeration without associated values or @available attributes on its cases. The synthesized allCases collection provides the cases in order of their declaration.

示例:

enum Drink: String, CaseIterable {
    case coffee = "Coffee"
    case tea = "Tea"
    case cola = "Cola"
    case water = "Water"
}

extension ViewController: UIPickerViewDelegate {
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return Drink.allCases[row].rawValue
    }
}

extension ViewController: UIPickerViewDataSource {
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return Drink.allCases.count
    }
}

您可以在 Github

上使用 UITextField 找到完整示例