programing tip

Swift의 원시 값에서 열거 형을 얻는 방법은 무엇입니까?

itbloger 2020. 12. 4. 07:59
반응형

Swift의 원시 값에서 열거 형을 얻는 방법은 무엇입니까?


원시 값에서 enum 유형을 얻으려고합니다.

enum TestEnum: String {
    case Name
    case Gender
    case Birth

    var rawValue: String {
        switch self {
        case .Name: return "Name"
        case .Gender: return "Gender"
        case .Birth: return "Birth Day"
        }
    }
}

let name = TestEnum(rawValue: "Name")       //Name
let gender = TestEnum(rawValue: "Gender")   //Gender

그러나 rawValue공백이있는 문자열에는 작동하지 않는 것 같습니다 .

let birth = TestEnum(rawValue: "Birth Day") //nil

그것을 얻는 방법에 대한 제안?


너무 복잡합니다. 케이스에 직접 원시 값을 할당합니다.

enum TestEnum: String {
  case Name = "Name"
  case Gender = "Gender"
  case Birth = "Birth Day"
}

let name = TestEnum(rawValue: "Name")!       //Name
let gender = TestEnum(rawValue: "Gender")!   //Gender
let birth = TestEnum(rawValue: "Birth Day")! //Birth

케이스 이름이 원시 값과 일치하면 생략 할 수도 있습니다.

enum TestEnum: String {
  case Name, Gender, Birth = "Birth Day"
}

Swift 3+에서 모든 enum 케이스는 lowercased


전체 작동 예 :

enum TestEnum: String {
    case name = "A Name"
    case otherName
    case test = "Test"
}

let first: TestEnum? = TestEnum(rawValue: "A Name")
let second: TestEnum? = TestEnum(rawValue: "OtherName")
let third: TestEnum? = TestEnum(rawValue: "Test")

print("\(first), \(second), \(third)")

이 모든 것이 작동하지만 원시 값을 사용하여 초기화 할 때는 선택 사항입니다. 이것이 문제라면 열거 형이 이것을 시도하고 처리 할 수있는 이니셜 라이저 또는 생성자를 만들고 none케이스를 추가 하고 열거 형을 만들 수없는 경우 반환 할 수 있습니다. 이 같은:

static func create(rawValue:String) -> TestEnum {
        if let testVal = TestEnum(rawValue: rawValue) {
            return testVal
        }
        else{
            return .none
        }
    }

다음 과 같이 열거 형정의 할 수 있습니다.

enum TestEnum: String {
    case Name, Gender, Birth
}

또는

enum TestEnum: String {
    case Name
    case Gender
    case Birth
}

멤버 값 중 하나 기본값 으로 사용하는 init 메서드를 제공 할 수 있습니다 .

enum TestEnum: String {
    case Name, Gender, Birth

    init() {
        self = .Gender
    }
}

위의 예에서 TestEnum.Name에는 "Name"의 암시 적 원시 값이 있습니다.

rawValue 속성을 사용하여 열거 형 케이스의 원시 값에 액세스합니다.

let testEnum = TestEnum.Name.rawValue
// testEnum is "Name"
let testEnum1 = TestEnum() 
// testEnum1 is "Gender"

함께 스위프트 4.2CaseIterable의 프로토콜은 전혀 어렵지 않다!

다음은이를 구현하는 방법의 예입니다.

import UIKit

private enum DataType: String, CaseIterable {
    case someDataOne = "an_awesome_string_one"
    case someDataTwo = "an_awesome_string_two"
    case someDataThree = "an_awesome_string_three"
    case someDataFour = "an_awesome_string_four"

    func localizedString() -> String {
        // Internal operation
        // I have a String extension which returns its localized version
        return self.rawValue.localized
    }

    static func fromLocalizedString(localizedString: String) -> DataType? {
        for type in DataType.allCases {
            if type.localizedString() == localizedString {
                return type
            }
        }
        return nil
    }

}

// USAGE EXAMPLE
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    if let dataType = DataType.fromLocalizedString(localizedString: self.title) {
        loadUserData(type: dataType)
    }
}

rawValue를 기반으로 DataType을 반환하도록 쉽게 수정할 수 있습니다. 도움이 되었기를 바랍니다.


Enum을 사용하여 원시 값 표시

import UIKit

enum car: String {
    case bmw =  "BMW"
    case jaquar = "JAQUAR"
    case rd = "RD"
    case benz = "BENZ"

}


class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        label.text = car.bmw.rawValue

    }


}

다음은 신속한 4.1에서 더 유용한 코드의 예입니다.

import UIKit

enum FormData {
  case userName
  case password

  static let array = [userName, password]

  var placeHolder: String {
    switch self {
    case .userName:
      return AppString.name.localized // will return "Name" string
    case .password:
      return AppString.password.localized // will return "Password" string
    }
  }
}

enum AppString: String {
  case name = "Name"
  case password = "Password"

  var localized: String {
    return NSLocalizedString(self.rawValue, comment: "")
  }
}

나는 이것이 신속한 4.2에 대한 빠르고 깨끗한 솔루션이라고 생각합니다 (당신은 놀이터에 c & p 할 수 있습니다)

import UIKit

public enum SomeEnum: String, CaseIterable {
    case sun,moon,venus,pluto
}

let str = "venus"
let newEnum = SomeEnum.allCases.filter{$0.rawValue == str}.first
// newEnum is optional
if let result = newEnum {
    print(result.rawValue)
}

참고 URL : https://stackoverflow.com/questions/36184795/how-to-get-enum-from-raw-value-in-swift

반응형