development

Swift의 튜플 열거 형

big-blog 2020. 12. 10. 20:50
반응형

Swift의 튜플 열거 형


Swift에서 튜플 열거 형을 만들 수 있습니까?

다음과 같은 것을 만들고 싶습니다.

enum ErrorCode: (Int, String) {
    case Generic_Error = (0, "Unknown")
    case DB_Error = (909, "Database")
}

하지만 컴파일되지 않습니다 ... 비슷한 결과를 얻을 수있는 방법이 있습니까?


"유사하다"는 의미에 따라 다릅니다. 내가하는 일은 정적 상수 속성이있는 Struct를 사용하는 것입니다.

struct Trouble {
    static let Generic_Error = (0, "Unknown")
    static let DB_Error = (909, "Database")
}

이제 Trouble.Generic_Error코드 전체에서 같은 것을 사용할 수 있습니다.


Swift 열거는 원시 값 유형으로 튜플을 가질 수 없습니다.

다른 방법으로는 코드를 저장하고 그로부터 설명을 파생하는 방법이 있습니다.

enum ErrorCode: Int, CustomStringConvertible {
    case Generic = 0
    case DB = 909

    var description: String {
        switch self {
        case .Generic:
            return "Unknown"
        case .DB:
            return "Database"
        }
    }
}

... 또는 열거 사례 자체에 코드 및 설명에 대한 관련 값을 저장합니다.

enum Error {
    case Generic(Int, String)
    case DB(Int, String)
}

상수 값을 찾고 있다면 @matt의 제안 struct도 가능합니다.


당신을 준수 할 수 RawRepresentable및 사용 (Int, String)은 AS Self.RawValue관련 유형입니다.

enum ErrorCode: RawRepresentable {
    case Generic_Error
    case DB_Error

    var rawValue: (Int, String) {
        switch self {
        case .Generic_Error: return (0, "Unknown")
        case .DB_Error: return (909, "Database")
        }
    }

    init?(rawValue: (Int, String)) {
        switch rawValue {
        case (0, "Unknown"): self = .Generic_Error
        case (909, "Database"): self = .DB_Error
        default: return nil
        }
    }
}

아마도 다음과 같은 일을 할 수 있습니다.

enum ErrorCode {
    case Generic_Error
    case DB_Error

    func values() -> (code: Int!, description: String?)! {
        switch self {
        case .Generic_Error:
            return (0, "Unknown")
        case .DB_Error:
            return (909, "Database")
        }
    }
}

나중에 그런 일을 할 수 있습니다.

let errorCode: ErrorCode = ErrorCode.Generic_Error;
if (errorCode.values().code == 0) {
    // do the business here...
}

생성 enum하고 var튜플 유형을 추가 하십시오 (String, String).

enum SomeType {
    case type1
    case type2
    case type3

    var typeNameAndDescription: (name: String, description: String) {
       switch self {
       case .type1:
            return ("type1 name", "type1 description")
        case .type2:
            return ("type2 name", "type2 description")
        case .type3:
            return ("type3 name", "type3 description")
       }
    }
}

이후 :

let myType = SomeType.type1
let typeName = myType.typeNameAndDescription.name
let typeDescription = myType.typeNameAndDescription.description

enum ErrorCode {
    case Generic_Error
    case DB_Error

    public var code:Int{
        switch self {
        case .Generic_Error: return 0
        case .DB_Error: return 909
        }
    }

    public var name:String{
        switch self {
        case .Generic_Error: return "Unknown"
        case .DB_Error: return "Database"
        }
    }
}

사용 :

let err:ErrorCode = .Generic_Error
print(err.code)   //0
print(err.name)   //Unknown

열거 형을 유지하는 내 솔루션은 rawValue var에 대한 get 메서드를 만드는 것입니다.

enum LoadingType {
  case poster
  case movie
  case refresh

  var rawValue: (file: String, anim: String) {
    get {
      switch self {
      case .movie:
        return ("poster_loading", "LoadingView")
      case .poster:
        return ("loading", "LoadingView")
      case .refresh:
        return ("loading", "RefreshView")
      }
    }
  }
}

이 코드를 사용하면 각 Tuple 요소를 이름으로 호출 할 수도 있습니다.

self.type.rawValue.file

Int로 열거 형을 만듭니다.

예를 들면 :

https://github.com/rhodgkins/SwiftHTTPStatusCodes/blob/master/Sources/HTTPStatusCodes.swift

참고 URL : https://stackoverflow.com/questions/26387275/enum-of-tuples-in-swift

반응형