Swift 열거 형의 수는 어떻게 얻습니까?


답변:


173

Swift 4.2 (Xcode 10)부터 CaseIterable프로토콜 준수를 선언 할 수 있으며 관련 값이없는 모든 열거에 작동합니다.

enum Stuff: CaseIterable {
    case first
    case second
    case third
    case forth
}

사례 수는 이제 간단히

print(Stuff.allCases.count) // 4

자세한 내용은


1
최신 버전의 스위프트에서 "Error 'Type'DAFFlow '가 프로토콜'RawRepresentable '을 준수하지 않습니다." 내가 그것을 따르도록 강요하는 이유는 무엇입니까? 어떤 생각?
Satyam

@Satyam : DAFFlow 란 무엇입니까?
Martin R

죄송합니다. "DAFFlow"는 다른 프로토콜에서 상속되지 않는 간단한 열거 형입니다.
Satyam

1
이것은 최고의 솔루션이지만 명확성을 위해-Apple 개발자는 Xcode 10 (Swift 4.2)이 베타 버전 (2018 년 9 월 14 일경)에서 나온 후에야 실제로 사용할 수 있습니다.
JosephH

1
@DaniSpringer : 당신은 피투성이의 세부 찾을 수 있습니다 github.com/apple/swift-evolution/blob/master/proposals/...을 . 그러나 일반적으로 컴파일러의 자동 유형 유추로 인해 해당 유형을 명시 적으로 필요로하지 않습니다.
Martin R

143

이에 대한 자세한 내용 의 블로그 게시물 이 있지만 열거 형의 원시 유형이 정수이면 다음과 같이 카운트를 추가 할 수 있습니다.

enum Reindeer: Int {
    case Dasher, Dancer, Prancer, Vixen, Comet, Cupid, Donner, Blitzen
    case Rudolph

    static let count: Int = {
        var max: Int = 0
        while let _ = Reindeer(rawValue: max) { max += 1 }
        return max
    }()
}

16
값을 하드 코딩 할 필요가 없기 때문에 좋지만 호출 될 때마다 모든 열거 형 값을 인스턴스화합니다. 그것은 O (1) 대신 O (n)입니다. :(
Code Commander

4
이것은 연속적인 Int에 대한 좋은 솔루션입니다. 약간의 수정을 선호합니다. 정적 카운트 속성을 정적 메서드 countCases ()로 바꾸고 정적 상수 caseCount에 할당하면 지연되고 반복되는 호출로 성능이 향상됩니다.
Tom Pelaia

2
@ShamsAhmed : 계산 된 var를 정적 변수로 변환했습니다.
네이트 쿡

3
열거 형에 가치가 없다면 어떻게해야합니까? 예를 들어 case A=1, B=3?
Sasho

2
언급하지 않은 원시 값을 enum갖는 것 외에 두 가지 가정 Int이 있습니다. 기본 동작이지만 1 씩 증가합니다.
Dávid Pásztor

90

Xcode 10 업데이트

CaseIterable열거 형 의 프로토콜을 채택하면 allCases모든 열거 형 케이스를 포함 하는 정적 속성을 제공 합니다 Collection. 그냥 사용count 속성을 하여 열거 형의 사례 수를 알 수 있습니다.

예를 들어 Martin의 답변을 참조하십시오 (그리고 내 대답보다는 찬성 투표하십시오)


경고 : 아래 방법은 더 이상 작동하지 않는 것 같습니다.

열거 형 수를 계산하는 일반적인 방법을 알지 못합니다. 그러나 hashValue열거 형 사례 의 속성은 0부터 시작하여 사례가 선언 된 순서에 따라 결정되는 점진적 인 것으로 나타났습니다 . 따라서 마지막 열거 형의 해시에 1을 더한 경우는 사례 수에 해당합니다.

예를 들어이 열거 형을 사용하면 :

enum Test {
    case ONE
    case TWO
    case THREE
    case FOUR

    static var count: Int { return Test.FOUR.hashValue + 1}
}

count 4를 반환합니다.

나는 그것이 규칙인지 또는 미래에 변경 될 것인지 말할 수 없으므로 자신의 책임하에 사용하십시오 :)


48
문서화되지 않은 기능으로 작동하고 문서화되지 않은 기능으로 사망합니다. 나는 그것을 좋아한다!
Nate Cook

9
우리는 실제로 hashValues이런 것들 에 의존해서는 안됩니다 . 우리가 아는 것은 임의의 고유 값이라는 것입니다. 컴파일러 구현 세부 사항에 따라 미래에 매우 쉽게 변경 될 수 있습니다. 그러나 전반적으로 빌트인 카운팅 기능의 부족은 혼란 스럽습니다.
Zorayr

16
명시 적으로 설정 괜찮다면 case ONE = 0, 당신은 그 때 교체 할 수 있습니다 hashValuerawValue.
Kevin Qi

3
여기서 문제는 문서화되지 않은 hashValue 속성을 사용하는 것이므로 문서화 된 rawValue 속성을 사용하는 것이 좋습니다.
Kevin Qi

7
당신은 이미 상수가 가장 높은 가치라는 사실을 이미 하드 코딩했습니다. static var count = 4Swift의 미래 구현 운명에 운명을 남기지 않고 더 나은 것을 사용하는 것이 더 안전하고 안전합니다
Dale

72

Nate Cook이 게시 한 접근 방식에 따라 사례 수를 자동으로 수행하는 재사용 가능한 프로토콜을 정의합니다.

protocol CaseCountable {
    static var caseCount: Int { get }
}

extension CaseCountable where Self: RawRepresentable, Self.RawValue == Int {
    internal static var caseCount: Int {
        var count = 0
        while let _ = Self(rawValue: count) {
            count += 1
        }
        return count
    }
}

그런 다음이 프로토콜을 예를 들어 다음과 같이 재사용 할 수 있습니다.

enum Planet : Int, CaseCountable {
    case Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}
//..
print(Planet.caseCount)

1
멋지고 우아한, 정답입니다 IMHO
shannoga

1
어쩌면 Swift 3count++count+=1++
Aladin

1
똑같이 할 수 없었 static var caseCount: Int { get }습니까? 왜 필요한가 static func?
pxpgraphics

열거 형에서 가치가 없다면 어떻게해야합니까? 예를 들어 case A=1, B=3?
Sasho

1
@Sasho, 그러면 작동하지 않습니다. 이를 위해서는 귀하의 사례가 시작되어 0간격이 없어야합니다.
NRitH

35

답변에 표시된 것처럼 정적 allValues ​​배열을 만듭니다.

enum ProductCategory : String {
     case Washers = "washers", Dryers = "dryers", Toasters = "toasters"

     static let allValues = [Washers, Dryers, Toasters]
}

...

let count = ProductCategory.allValues.count

이것은 값을 열거하고 모든 Enum 유형에서 작동 할 때 유용합니다.


확장 솔루션만큼이나 우아하지는 않지만 수작업보다 훨씬 많은 것을 제공하므로 이것이 가장 유용하다고 생각합니다. 값 순서와 모든 값 목록을 제공합니다.
Nader Eloshaiker

2
를 수행하여 열거에 계수를 추가 할 수도 있습니다 static let count = allValues.count. 그런 다음 allValues원하는 경우 개인을 만들 수 있습니다.
ThomasW

15

구현에 정수 열거 형을 사용하는 것에 대한 내용이없는 경우 열거 형 Count의 멤버 수를 나타 내기 위해 추가 멤버 값을 추가 할 수 있습니다 ( 아래 예 참조).

enum TableViewSections : Int {
  case Watchlist
  case AddButton
  case Count
}

이제 호출하여 열거 형의 멤버 수를 얻을 수 있습니다 TableViewSections.Count.rawValue. 위의 예에서는 2를 반환합니다.

switch 문에서 열거 형을 처리 할 때 Count예상치 못한 멤버 가 발생할 때 어설 션 오류를 발생시켜야 합니다.

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  let currentSection: TableViewSections = TableViewSections.init(rawValue:section)!
  switch(currentSection) {
  case .Watchlist:
    return watchlist.count
  case .AddButton:
    return 1
  case .Count:
    assert(false, "Invalid table view section!")
  }
}

열거 형 값을 더 추가 할 때 카운트가 자동으로 변경되므로 해당 솔루션이 마음에 듭니다. 그러나 이것은 열거의 rawValues가 0으로 시작할 때만 작동한다는 것을 명심하십시오.
joern

2
동의합니다. 두 가지 제한이 있습니다. 정수 열거 여야하고 0에서 시작하여 점진적으로 계속 진행해야합니다.
Zorayr

3
/ : 나는 스위프트의 더 강력한 열거의 전체 포인트는 우리가 목표 - C에서 사용되는 동일한 해킹을 사용하지 것이다라고 생각
pkamb

14

이러한 종류의 함수는 열거의 개수를 반환 할 수 있습니다.

스위프트 2 :

func enumCount<T: Hashable>(_: T.Type) -> Int {
    var i = 1
    while (withUnsafePointer(&i) { UnsafePointer<T>($0).memory }).hashValue != 0 {
        i += 1
    }
    return i
}

스위프트 3 :

func enumCount<T: Hashable>(_: T.Type) -> Int {
   var i = 1
   while (withUnsafePointer(to: &i, {
      return $0.withMemoryRebound(to: T.self, capacity: 1, { return $0.pointee })
   }).hashValue != 0) {
      i += 1
   }
      return i
   }

3
이것은 더 이상 적절한 구현 해결하려고 노력하지만, 빈 오는 스위프트 3. 작동하지 않습니다
코디 윈튼

의 단부에 바로 인접 메모리 어드레스 경우 디버그 매우 unfun 것 enum아니라 Hashable 동일한 유형.
NRitH

10

인덱스가있는 문자열 열거 형

enum eEventTabType : String {
    case Search     = "SEARCH"
    case Inbox      = "INBOX"
    case Accepted   = "ACCEPTED"
    case Saved      = "SAVED"
    case Declined   = "DECLINED"
    case Organized  = "ORGANIZED"

    static let allValues = [Search, Inbox, Accepted, Saved, Declined, Organized]
    var index : Int {
       return eEventTabType.allValues.indexOf(self)!
    }
}

카운트 : eEventTabType.allValues.count

인덱스 : objeEventTabType.index

즐겨 :)


10

모두 안녕, 단위 테스트는 어때?

func testEnumCountIsEqualToNumberOfItemsInEnum() {

    var max: Int = 0
    while let _ = Test(rawValue: max) { max += 1 }

    XCTAssert(max == Test.count)
}

이것은 Antonio의 솔루션과 결합되었습니다.

enum Test {

    case one
    case two
    case three
    case four

    static var count: Int { return Test.four.hashValue + 1}
}

메인 코드를 당신에게 제공 O (1) 플러스 당신이 실패 테스트를받을 사람이 열거 케이스를 추가하는 경우 five와의 구현을 업데이트하지 않습니다 count.


7

이 함수는 문서화되지 않은 두 가지 현재 (Swift 1.1) enum동작 에 의존합니다 .

  • 의 메모리 레이아웃 enum은 단지 인덱스입니다 case. 사례 개수가 2 ~ 256 인 경우 UInt8입니다.
  • (가) 경우 enum였다에서 비트 캐스트 유효하지 않은 경우 지수의 hashValueIS0

따라서 귀하의 책임하에 사용하십시오 :)

func enumCaseCount<T:Hashable>(t:T.Type) -> Int {
    switch sizeof(t) {
    case 0:
        return 1
    case 1:
        for i in 2..<256 {
            if unsafeBitCast(UInt8(i), t).hashValue == 0 {
                return i
            }
        }
        return 256
    case 2:
        for i in 257..<65536 {
            if unsafeBitCast(UInt16(i), t).hashValue == 0 {
                return i
            }
        }
        return 65536
    default:
        fatalError("too many")
    }
}

용법:

enum Foo:String {
    case C000 = "foo"
    case C001 = "bar"
    case C002 = "baz"
}
enumCaseCount(Foo) // -> 3

릴리스 및 임시 애플리케이션
충돌

이것은 시뮬레이터에서 작동하지만 실제 64 비트 장치에서는 작동하지 않습니다.
Daniel Nord

5

원시 값이 정수 인 모든 열거 형을 제공하는 간단한 확장을 작성했습니다 count.

extension RawRepresentable where RawValue: IntegerType {
    static var count: Int {
        var i: RawValue = 0
        while let _ = Self(rawValue: i) {
            i = i.successor()
        }
        return Int(i.toIntMax())
    }
}

불행히도 count속성이 OptionSetType제대로 작동하지 않는 곳을 제공 하므로 CaseCountable계산하려는 열거 형에 대해 프로토콜을 명시 적으로 준수 해야하는 다른 버전이 있습니다.

protocol CaseCountable: RawRepresentable {}
extension CaseCountable where RawValue: IntegerType {
    static var count: Int {
        var i: RawValue = 0
        while let _ = Self(rawValue: i) {
            i = i.successor()
        }
        return Int(i.toIntMax())
    }
}

Tom Pelaia가 게시 한 접근 방식과 매우 유사하지만 모든 정수 유형에서 작동합니다.


4

물론 그것은 역동적이지는 않지만 많은 용도에서 Enum에 정적 변수를 추가하여 얻을 수 있습니다.

static var count: Int{ return 7 }

그런 다음 EnumName.count


3
enum EnumNameType: Int {
    case first
    case second
    case third

    static var count: Int { return EnumNameType.third.rawValue + 1 }
}

print(EnumNameType.count) //3

또는

enum EnumNameType: Int {
    case first
    case second
    case third
    case count
}

print(EnumNameType.count.rawValue) //3

* Swift 4.2 (Xcode 10)에서는 다음을 사용할 수 있습니다.

enum EnumNameType: CaseIterable {
    case first
    case second
    case third
}

print(EnumNameType.allCases.count) //3

2

내 유스 케이스의 경우 여러 사람이 열거에 키를 추가 할 수있는 코드베이스에서 allKeys 속성에서 이러한 케이스를 모두 사용할 수 있어야하므로 열거의 키에 대해 allKeys의 유효성을 검사하는 것이 중요합니다. 이것은 누군가가 자신의 키를 모든 키 목록에 추가하는 것을 잊는 것을 피하기위한 것입니다.열거의 키 수에 대해 allKeys 배열 (처음 삭제를 피하기 위해 세트로 작성된) 수를 일치 시키면 모두 존재합니다.

위의 답변 중 일부는 Swift 2에서이를 달성하는 방법을 보여 주지만 Swift 3 에서는 작동하지 않습니다 . 다음은 Swift 3 형식 버전입니다.

static func enumCount<T: Hashable>(_ t: T.Type) -> Int {
    var i = 1
    while (withUnsafePointer(to: &i) {
      $0.withMemoryRebound(to:t.self, capacity:1) { $0.pointee.hashValue != 0 }
    }) {
      i += 1
    }
    return i
}

static var allKeys: [YourEnumTypeHere] {
    var enumSize = enumCount(YourEnumTypeHere.self)

    let keys: Set<YourEnumTypeHere> = [.all, .your, .cases, .here]
    guard keys.count == enumSize else {
       fatalError("Missmatch between allKeys(\(keys.count)) and actual keys(\(enumSize)) in enum.")
    }
    return Array(keys)
}

사용 사례에 따라 각 요청에서 allKeys를 사용하는 오버 헤드를 피하기 위해 개발에서 테스트를 실행하는 것이 좋습니다.


2

왜 그렇게 복잡하게 만드나요? Int enum의 SIMPLEST 카운터는 다음을 추가하는 것입니다.

case Count

결국. 그리고 ... 비올라-이제 카운트가 있습니다-빠르고 간단합니다


1
이것은 a) 불필요한 enum 케이스를 추가하고 b) enum의 raw 유형이 Int 이외의 다른 경우 작동하지 않습니다.
Robert Atkins

이것은 실제로 나쁜 대답이 아닙니다. 그러나 위의 @Tom Pelaia의 대답과 같이 원시 값은 시작 0해야하며 시퀀스에 간격이 없습니다.
NRitH

1

마지막 열거 형을 기반으로 코드를 작성하지 않으려는 경우 열거 형 내에이 함수를 만들 수 있습니다.

func getNumberOfItems() -> Int {
    var i:Int = 0
    var exit:Bool = false
    while !exit {
        if let menuIndex = MenuIndex(rawValue: i) {
            i++
        }else{
            exit = true
        }
    }
    return i
}

1

타입 열거 형으로 작업 하는 Swift 3 버전 Int:

protocol CaseCountable: RawRepresentable {}
extension CaseCountable where RawValue == Int {
    static var count: RawValue {
        var i: RawValue = 0
        while let _ = Self(rawValue: i) { i += 1 }
        return i
    }
}

크레딧 : bzz와 Nate Cook의 답변을 기반으로합니다.

Generic IntegerType(Swift 3에서로 이름이 바뀐 Integer)은 많은 기능이 부족한 조각난 제네릭 형식이므로 지원되지 않습니다. successor더 이상 Swift 3에서는 사용할 수 없습니다.

Code Commander에서 Nate Cooks의 답변에 대한 주석은 여전히 ​​유효합니다.

값을 하드 코딩 할 필요가 없기 때문에 좋지만 호출 될 때마다 모든 열거 형 값을 인스턴스화합니다. 그것은 O (1) 대신 O (n)입니다.

내가 아는 한 일반 유형에서 지원되지 않는 정적 저장 속성으로 인해 프로토콜 확장으로 사용하고 (Nate Cook처럼 각 열거 형에서 구현하지 않은 경우) 현재 해결 방법이 없습니다.

어쨌든, 작은 열거 형의 경우 이것은 문제가되지 않습니다. 일반적인 사용 사례가 될 것이라고 section.count위해 UITableViews이미 Zorayr 언급한다.


1

Matthieu Riegler의 답변을 확장하여 이것은 제네릭을 사용할 필요가없는 Swift 3 용 솔루션 이며 다음과 함께 열거 형을 사용하여 쉽게 호출 할 수 있습니다 EnumType.elementsCount.

extension RawRepresentable where Self: Hashable {

    // Returns the number of elements in a RawRepresentable data structure
    static var elementsCount: Int {
        var i = 1
        while (withUnsafePointer(to: &i, {
            return $0.withMemoryRebound(to: self, capacity: 1, { return 
                   $0.pointee })
        }).hashValue != 0) {
            i += 1
        }
        return i
}

0

프로토콜 (EnumIntArray)과 전역 유틸리티 함수 (enumIntArray)를 만들어서 모든 열거 형에 "All"변수를 쉽게 추가 할 수있게함으로써 (swift 1.2 사용)이 문제를 직접 해결했습니다. "all"변수는 열거 형에있는 모든 요소의 배열을 포함하므로 개수에 all.count를 사용할 수 있습니다.

Int 유형의 원시 값을 사용하는 열거 형에서만 작동하지만 다른 유형에 대한 영감을 줄 수 있습니다.

또한 위에서 읽은 다른 곳에서 읽은 "번호 매기기 간격"및 "과도한 반복 시간"문제도 해결합니다.

EnumIntArray 프로토콜을 열거 형에 추가 한 다음 enumIntArray 함수를 호출하여 "all"정적 변수를 정의하고 첫 번째 요소 (번호 매기기에 공백이있는 경우 마지막)를 제공하는 것이 좋습니다.

정적 변수는 한 번만 초기화되므로 모든 원시 값을 통과하는 오버 헤드는 프로그램에 한 번만 적용됩니다.

예 (간격없이) :

enum Animals:Int, EnumIntArray
{ 
  case Cat=1, Dog, Rabbit, Chicken, Cow
  static var all = enumIntArray(Animals.Cat)
}

예 (갭이 있음) :

enum Animals:Int, EnumIntArray
{ 
  case Cat    = 1,  Dog, 
  case Rabbit = 10, Chicken, Cow
  static var all = enumIntArray(Animals.Cat, Animals.Cow)
}

이를 구현하는 코드는 다음과 같습니다.

protocol EnumIntArray
{
   init?(rawValue:Int)
   var rawValue:Int { get }
}

func enumIntArray<T:EnumIntArray>(firstValue:T, _ lastValue:T? = nil) -> [T]
{
   var result:[T] = []
   var rawValue   = firstValue.rawValue
   while true
   { 
     if let enumValue = T(rawValue:rawValue++) 
     { result.append(enumValue) }
     else if lastValue == nil                     
     { break }

     if lastValue != nil
     && rawValue  >  lastValue!.rawValue          
     { break }
   } 
   return result   
}

0

또는 _count열거 형 외부를 정의하고 정적으로 연결할 수 있습니다.

let _count: Int = {
    var max: Int = 0
    while let _ = EnumName(rawValue: max) { max += 1 }
    return max
}()

enum EnumName: Int {
    case val0 = 0
    case val1
    static let count = _count
}

그렇게하면 열거 형의 수에 관계없이 한 번만 생성됩니다.

(그렇다면이 답변을 삭제하십시오 static)


0

다음 방법은 CoreKit 에서 왔으며 다른 사람들이 제안한 답변과 비슷합니다. 이것은 Swift 4에서 작동합니다.

public protocol EnumCollection: Hashable {
    static func cases() -> AnySequence<Self>
    static var allValues: [Self] { get }
}

public extension EnumCollection {

    public static func cases() -> AnySequence<Self> {
        return AnySequence { () -> AnyIterator<Self> in
            var raw = 0
            return AnyIterator {
                let current: Self = withUnsafePointer(to: &raw) { $0.withMemoryRebound(to: self, capacity: 1) { $0.pointee } }
                guard current.hashValue == raw else {
                    return nil
                }
                raw += 1
                return current
            }
        }
    }

    public static var allValues: [Self] {
        return Array(self.cases())
    }
}

enum Weekdays: String, EnumCollection {
    case sunday, monday, tuesday, wednesday, thursday, friday, saturday
}

그럼 당신은 그냥 전화해야합니다 Weekdays.allValues.count.


0
enum WeekDays : String , CaseIterable
{
  case monday = "Mon"
  case tuesday = "Tue"
  case wednesday = "Wed"
  case thursday = "Thu"
  case friday = "Fri"
  case saturday = "Sat"
  case sunday = "Sun"
}

var weekdays = WeekDays.AllCases()

print("\(weekdays.count)")

-1
struct HashableSequence<T: Hashable>: SequenceType {
    func generate() -> AnyGenerator<T> {
        var i = 0
        return AnyGenerator {
            let next = withUnsafePointer(&i) { UnsafePointer<T>($0).memory }
            if next.hashValue == i {
                i += 1
                return next
            }
            return nil
        }
    }
}

extension Hashable {
    static func enumCases() -> Array<Self> {
        return Array(HashableSequence())
    }

    static var enumCount: Int {
        return enumCases().enumCount
    }
}

enum E {
    case A
    case B
    case C
}

E.enumCases() // [A, B, C]
E.enumCount   //  3

열거 형 이외의 유형에주의하십시오. 몇 가지 해결 방법은 다음과 같습니다.

struct HashableSequence<T: Hashable>: SequenceType {
    func generate() -> AnyGenerator<T> {
        var i = 0
        return AnyGenerator {
            guard sizeof(T) == 1 else {
                return nil
            }
            let next = withUnsafePointer(&i) { UnsafePointer<T>($0).memory }
            if next.hashValue == i {
                i += 1
                return next
            }

            return nil
        }
    }
}

extension Hashable {
    static func enumCases() -> Array<Self> {
        return Array(HashableSequence())
    }

    static var enumCount: Int {
        return enumCases().count
    }
}

enum E {
    case A
    case B
    case C
}

Bool.enumCases()   // [false, true]
Bool.enumCount     // 2
String.enumCases() // []
String.enumCount   // 0
Int.enumCases()    // []
Int.enumCount      // 0
E.enumCases()      // [A, B, C]
E.enumCount        // 4

-1

열거의 마지막 값에 1을 더한 정적 상수를 사용할 수 있습니다.

enum Color : Int {
    case  Red, Orange, Yellow, Green, Cyan, Blue, Purple

    static let count: Int = Color.Purple.rawValue + 1

    func toUIColor() -> UIColor{
        switch self {
            case .Red:
                return UIColor.redColor()
            case .Orange:
                return UIColor.orangeColor()
            case .Yellow:
                return UIColor.yellowColor()
            case .Green:
                return UIColor.greenColor()
            case .Cyan:
                return UIColor.cyanColor()
            case .Blue:
                return UIColor.blueColor()
            case .Purple:
                return UIColor.redColor()
        }
    }
}

-3

이것은 작지만 더 나은 O (1) 솔루션은 다음과 같습니다 ( 열거가 x 등에서 시작하는 경우 에만Int ).

enum Test : Int {
    case ONE = 1
    case TWO
    case THREE
    case FOUR // if you later need to add additional enums add above COUNT so COUNT is always the last enum value 
    case COUNT

    static var count: Int { return Test.COUNT.rawValue } // note if your enum starts at 0, some other number, etc. you'll need to add on to the raw value the differential 
}

현재 선택한 답변은 여전히 ​​모든 열거 형에 가장 적합한 답변이라고 생각 Int합니다. 작업하지 않는 한이 솔루션을 권장합니다.


3
실제로 열거 형의 유형을 나타내지 않는 열거 형에 값을 추가하는 것은 나쁜 코드 냄새입니다. 때로는 유혹을받을 수도 있지만 "ALL"또는 "NONE"을 포함시키는 것도 정당화하기 어렵다는 것을 알게되었습니다. 이 문제를 해킹하기 위해 "COUNT"를 포함시키는 것은 매우 까다 롭습니다.
마이클 피터슨

1
악취? 당신이 그것을 확실하게 부르고 싶다면. 수행자? 예. 장단점을 결정하는 것은 개발자의 몫입니다. 이것은 실제로 Zorayr의 답변과 동일한 답변이며, 이에 대해 자세히 설명하고 새로운 수락 답변도 비슷합니다. 그러나 신속하게 API를 추가 할 때까지; 이것이 우리 중 일부가 사용하기로 결정한 것입니다. 당신은 열거 값을 검증하는 기능을 추가 할 수 있습니다 guard에 대해이야 COUNT및 유형의 표현의 우려를 해결하기 위해 오류, false를 반환 등을 발생합니다.
Drmorgan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.