2016-09-14 1 views
1

월요일부터 일요일까지의 날이있는 테이블보기가 있습니다. 비트 마스크를 사용하여 모두 선택/선택 취소를 나타낼 수 있습니다.스위프트. 주중 문제의 비트 마스크입니다. 스위치 비트

예를 들어 모두 선택하면 1111111은 2 진수로, 127은 10 진수로 표시됩니다. 열거 형 예제를 찾았지만 열거 형에서 Integer를 가져 오는 방법을 인식하지 못하고 필요에 따라 해당 수를 선택한 요일로 다시 변환합니다.

테이블에서 모든 요일을 선택한 다음 테이블을두고 다시 한 번 다시 열어 보겠습니다. 그래서 내 데이터에는 내가 선택한 모든 요일을 나타내는 127 개가 있습니다 (예 : 2 일 또는 3 일 선택 가능). 그래서 나는 선택한 요일에 표시를하고 싶다. 하지만 저는 십진법이 있습니다.

더 좋은 방법은 무엇입니까?

그리고 쓸 수있는 방법이 있어야한다 switch

종류 같은 것 같아요 : 여기

func markDaysAsSelctedWith(number: Int) 
{ 
    switch (number) { 
    case Days.Monday 
    case Days.Sunday 
} 

내 문제입니다 :

: 내가 선택한 일 수요일과 목요일을 나타내는 숫자 12을 사용하는 경우 다음 작동하지 않습니다 전환
M = 1, 
Tu = 2, 
W = 4, 
Th = 8, 
F = 16, 
Sa = 32, 
Su = 64 

...

+1

이 예를 살펴 'OptionSet'을 사용하여 http://stackoverflow.com/a/24066171/2099148 –

답변

2

귀하의 경우, OptionSetType을 채택하는 것이 좋습니다. OptionSetType에 부합하는 구조체를 선언와

:

func markDaysAsSelectedWith(days: Days) 
{ 
    if days.contains(.Monday) { 
     print("Monday marked") 
    } 
    if days.contains(.Tuesday) { 
     print("Tuesday marked") 
    } 
    if days.contains(.Wednesday) { 
     print("Wednesday marked") 
    } 
    if days.contains(.Thursday) { 
     print("Thursday marked") 
    } 
    if days.contains(.Friday) { 
     print("Friday marked") 
    } 
    if days.contains(.Saturday) { 
     print("Saturday marked") 
    } 
    if days.contains(.Sunday) { 
     print("Sunday marked") 
    } 
} 

을 그리고 그것을 사용 :

당신은 다음처럼 작성할 수 있습니다

struct Days: OptionSetType { 
    var rawValue: Int 
    init(rawValue: Int) {self.rawValue = rawValue} 

    static let Monday = Days(rawValue: 1<<0) 
    static let Tuesday = Days(rawValue: 1<<1) 
    static let Wednesday = Days(rawValue: 1<<2) 
    static let Thursday = Days(rawValue: 1<<3) 
    static let Friday = Days(rawValue: 1<<4) 
    static let Saturday = Days(rawValue: 1<<5) 
    static let Sunday = Days(rawValue: 1<<6) 
} 

(당신은 여전히 ​​스위프트 2를 사용하는 가정) 예 :

markDaysAsSelectedWith([.Monday,.Tuesday]) 
//Output: 
//Monday marked 
//Tuesday marked 
let number = 12 
let days = Days(rawValue: number) 
markDaysAsSelectedWith(days) 
//Output: 
//Wednesday marked 
//Thursday marked 

(추가) 선택 일

이미 마틴 R의 코멘트에서 언급 한 바와 같이에서 번호를 얻는 방법, 당신은 rawValue 속성 rawValue을 기본 검색 할 수 있습니다

let otherDays: Days = [.Wednesday,.Thursday] 
print(otherDays.rawValue) //->12 
+1

답변을 주셔서 감사합니다. 매우 상세합니다. 또한 선택한 날짜의 수를 얻는 방법을 알고있을 수도 있습니다. 수요일과 목요일을 선택하면 12 일이 필요합니다. –

+2

@MatrosovAlexander :'days.rawValue'는 기본 정수를 제공합니다. –

2

각 테이블 뷰 행 (0 ~ 6)에 대해 비트 마스크의 해당 위치에있는 비트가 설정되어 있는지 확인하고 그에 따라 행을 선택하거나 선택 취소하십시오. 예 :

let selectedWeekdays = 69 // == 1 + 4 + 64 

for i in 0..<7 { 
    if selectedWeekdays & (1 << i) != 0 { 
     print("select row #", i) 
    } else { 
     print("deselect row #", i) 
    } 
} 

출력 :

 
select row # 0 
deselect row # 1 
select row # 2 
deselect row # 3 
deselect row # 4 
deselect row # 5 
select row # 6 
+0

감사합니다. –

관련 문제