2016-09-14 3 views
1

月曜日から日曜日までの日数のあるテーブルビューがあります。私はビットマスクを使用してそれらのすべてを選択/選択解除することができます。スイフト。平日のビットマスク。スイッチビット

たとえば、すべてを選択すると、1111111はバイナリ、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 

(ADDITION)選択日間

すでにマーティン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

マーティンあなたがたびに、良い解決策を助けてくれてありがとう! –