Swift에서 Enumeration 연결 값 액세스
이 코드에서 나는 가능성을 정의하는 정말 쓸모없는 열거형을 썼습니다.Number
내부 플로트를 사용합니다.
협회에서 설정한 값을 어떻게 액세스할 수 있는지 이해할 수 없습니다.인쇄하려고 하면 그냥.(Enum Value)
enum Number {
case int (Int)
case float (Float)
}
let integer = Number.int(10)
let float = Number.float(10.5)
println("integer is \(integer)")
println("float is \(float)")
완전성을 위해 패턴 일치가 있는 if 문을 사용하여 열거형의 연결 값에 액세스할 수도 있습니다.원본 코드에 대한 솔루션은 다음과 같습니다.
enum Number {
case int (Int)
case float (Float)
}
let integer = Number.int(10)
let float = Number.float(10.5)
if case let .int(i) = integer {
print("integer is \(i)")
}
if case let .float(f) = float {
print("float is \(f)")
}
이 솔루션에 대한 자세한 내용은 https://appventure.me/2015/10/17/advanced-practical-enum-examples/ 에서 확인할 수 있습니다.
값은 열거형의 인스턴스와 연결됩니다.따라서 스위치 없이 액세스하려면 게터를 만들어 명시적으로 사용할 수 있도록 해야 합니다.다음과 같은 것이 있습니다.
enum Number {
case int(Int)
case float(Float)
func get() -> NSNumber {
switch self {
case .int(let num):
return num
case .float(let num):
return num
}
}
}
var vInteger = Number.int(10)
var vFloat = Number.float(10.5)
println(vInteger.get())
println(vFloat.get())
아마도 미래에는 그런 것이 자동으로 만들어지거나 언어에 더 짧은 편의가 추가될 수도 있습니다.
Swift 2(베타 2 기준)가 이 문제를 해결하지 못하는 것은 놀라운 일입니다.다음은 현재 해결 방법의 예입니다.
enum TestAssociatedValue {
case One(Int)
case Two(String)
case Three(AnyObject)
func associatedValue() -> Any {
switch self {
case .One(let value):
return value
case .Two(let value):
return value
case .Three(let value):
return value
}
}
}
let one = TestAssociatedValue.One(1)
let oneValue = one.associatedValue() // 1
let two = TestAssociatedValue.Two("two")
let twoValue = two.associatedValue() // two
class ThreeClass {
let someValue = "Hello world!"
}
let three = TestMixed.Three(ThreeClass())
let threeValue = three. associatedValue() as! ThreeClass
print(threeValue.someValue)
열거형에 대/소문자가 연결된 값이 있거나 연결되지 않은 경우 반환 유형을 선택 사항으로 만들어야 합니다.연결된 값이 없는 경우 원시 값 형식의 열거형을 모방하여 리터럴을 반환할 수도 있습니다.연관되지 않은 원시 유형이 아닌 경우에도 열거값 자체를 반환할 수 있습니다.예:
enum TestMixed {
case One(Int)
case Two(String)
case Three(AnyObject)
case Four
case Five
func value() -> Any? {
switch self {
case .One(let value):
return value
case .Two(let value):
return value
case .Three(let value):
return value
case .Four:
return 4
case .Five:
return TestMixed.Five
}
}
}
let one = TestMixed.One(1)
let oneValue = one.value() // 1
let two = TestMixed.Two("two")
let twoValue = two.value() // two
class ThreeClass {
let someValue = "Hello world!"
}
let three = TestMixed.Three(ThreeClass())
let threeValue = three.value() as! ThreeClass
print(threeValue.someValue)
let four = TestMixed.Four
let fourValue = four.value() // 4
let five = TestMixed.Five
let fiveValue = five.value() as! TestMixed
switch fiveValue {
case TestMixed.Five:
print("It is")
default:
print("It's not")
}
// Prints "It is"
like @iQ. an swer, 열거형에서도 속성을 사용할 수 있습니다.
enum Number {
case int (Int)
var value: Int {
switch self {
case .int(let value):
return value
}
}
}
let integer = Number.int(10)
println("integer is \(integer.value)")
스위치를 통해서만 열거형 관련 값에 액세스할 수 있습니다!거울은 우리를 도와줍니다.
프로토콜을 생성합니다.
protocol MirrorAssociated {
var associatedValues: [String: Any] { get }
}
extension MirrorAssociated {
var associatedValues: [String: Any] {
var values = [String: Any]()
if let associated = Mirror(reflecting: self).children.first {
let children = Mirror(reflecting: associated.value).children
for case let item in children {
if let label = item.label {
values[label] = item.value
}
}
}
return values
}
}
다음과 같이 사용합니다.
enum Test: MirrorAssociated {
case test(value: String, anotherValue: Int)
}
이제 스위치를 사용하지 않고도 관련 값에 액세스할 수 있습니다.
let test: Test = .test(value: "Test String", anotherValue: 1337)
if let value = test.associatedValues["value"] as? String {
print("\(value)") // "Test String"
}
if let intValue = test.associatedValues["anotherValue"] as? Int {
print("\(intValue)") // 1337
}
저는 다음과 같은 것을 사용했습니다.
switch number {
case .int(let n):
println("integer is \(n)")
case .float(let n):
println("float is \(n)")
}
가드를 사용하는 경우 다음과 같이 쓸 수 있습니다.
enum Action {
case .moveTab(index: Int)
}
guard let case .moveTab(index) = someAction else { return }
스위프트 5
enum Directory {
case accountImages(URL)
case accountData(URL)
var url: URL {
switch self {
case .accountImages(let url):
return url
case .accountData(let url):
return url
}
}
}
func save(to directory: Directory) {
let dir = directory.url
}
enum NumberEnum {
case int(Int)
case float(Float)
case twoInts(Int, Int)
}
let someNum = NumberEnum.twoInts(10,10)
Value Associated Enum에서 값을 얻으려면 다음 세 가지 방법 중 하나를 수행합니다.
방법 1:
if case .twoInts( let val1, let val2 ) = someNum {
print("hello \(val1) \(val2)")
}
방법 2:
guard case let .int(val) = someNum else { return }
print(val)
방법 3:
switch someNum {
case .int(let val):
print("\(val)")
default:
break;
}
스위프트 4,
파이어베이스 데이터베이스 참조 경로를 처리하기 위해 관련 값이 있는 단순 열거형을 만들었습니다.
import Firebase
enum FirebaseDBConstants {
case UserLocation(database : DatabaseReference, userID :String)
case UserRequest(database : DatabaseReference, requestID :String)
func getDBPath() -> DatabaseReference {
switch self {
case .UserLocation(let database,let userID):
return database.root.child(FirebaseDBEnvironmentEnum.getCurrentEnvioronMent()).child("Location").child(userID).child("JSON")
case .UserRequest(let database,let requestID):
return database.root.child(FirebaseDBEnvironmentEnum.getCurrentEnvioronMent()).child("Request").child(requestID)
default:
break
}
}
}
그림과 같이 사용합니다.
//Pass Database refenence root as parameter with your request id
let dbPath = FirebaseDBConstants.UserRequest(database: database, requestID: requestId).getDBPath()
언급URL : https://stackoverflow.com/questions/24263539/accessing-an-enumeration-association-value-in-swift
'programing' 카테고리의 다른 글
정의되지 않은 '모드' 속성을 읽을 수 없습니다. (0) | 2023.08.18 |
---|---|
jQuery 페이지 하단으로 스크롤 (0) | 2023.08.18 |
ASP 설치 및 사용 방법의 NET AJAX 컨트롤 툴킷.NET 3.5 웹 애플리케이션? (0) | 2023.08.18 |
스프링카프카 vs.Spring-Cloud-Stream(카프카) (0) | 2023.08.18 |
Django를 사용하여 동적으로 생성된 이미지 제공 (0) | 2023.08.18 |