如何从Swift的原始值中获取枚举?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从Swift的原始值中获取枚举?相关的知识,希望对你有一定的参考价值。
我正在尝试从原始值获取枚举类型:
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
}
}
另一答案
你可以像这样define enum -
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"
另一答案
使用Swift 4.2和CaseIterable协议,它并不难!
以下是如何实现它的示例。
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。我希望它有所帮助!
另一答案
这是swift 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: "")
}
}
另一答案
使用Enum显示rawvalue
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
}
}
另一答案
我认为这是一个快速而干净的解决方案,适用于swift 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)
}
以上是关于如何从Swift的原始值中获取枚举?的主要内容,如果未能解决你的问题,请参考以下文章