読者です 読者をやめる 読者になる 読者になる

Cocoa API解説(macOS/iOS)

iOS , Mac アプリケーション開発のために使われる主要フレームワークの日本語情報です。

目次

ビットマスクの判定法[Swift]

コラム 逆引き swift

INDEX

ビットマスクでどのフラグが立っているのか知りたい場合の方法

例えば、NSWindowのどのボタンが有効になっているか、タイトルバーはあるのかが知りたい場合はNSWindowのstyleMaskプロパティで知ることができるが、返されるのはIntなので、どのフラグが立っているのかはすぐにはわからない。
そこでビット演算。NSResizableWindowMaskは整数値で、10進数では8、2進数では1000となる。
Swift上で2進数を表すのには「0b」をつければ良いので0b1000となる。

let flag4 = (window.styleMask & 0b001000) >> 3 

仮にwindow.styleMaskの値が9だったとしよう。
10進数の9は2進数では1001なのでSwift上では0b1001となる。
ANDの演算(両方1だったら1、それ以外は0)を行うと
1001 & 1000
縦に並べてみると
1001 &
1000

              • -

1000
となる。
そのあとビットのシフト(移動)を行う。
1000 >> 3
3桁右へ移動するので
0001となる。
つまり10進数で1の値となる。

Swiftではifの判定にはIntではダメらしいのでBoolにしてやらないといけない。

 if (((window.styleMask & 0b001000) >> 3)>0){
            NSLog("NSResizableWindowMask")
        }

これで、指定した位置のフラグが立っているかどうかっていうのがわかる



Swift

    //NSWindow styleMask
    @IBAction func function003(sender: AnyObject) {
        var window : NSWindow = NSWindow(
            contentRect: NSMakeRect(0.0, 0.0, 300, 200),
            styleMask:  NSTitledWindowMask |
                        NSClosableWindowMask |
                        NSMiniaturizableWindowMask |
                        NSResizableWindowMask,
            backing: .Buffered,
            defer: false)
        windowArray.addObject(window) //ウインドウを保持するための入れるに追加。アプリ終了時に配列は破棄
        window.center()//ウインドウをスクリーンんの中心に
        window.title = "ウインドウタイトル"//タイトル設定
        window.orderFront(self)//前面に
        window.makeKeyAndOrderFront(self)//表示
        //let flag5 = (window.styleMask & 0b010000) >> 4
        //let flag4 = (window.styleMask & 0b001000) >> 3 //NSResizableWindowMask
        //let flag3 = (window.styleMask & 0b000100) >> 2 //NSMiniaturizableWindowMask
        //let flag2 = (window.styleMask & 0b000010) >> 1 //NSClosableWindowMask
        //let flag1 = (window.styleMask & 0b000001)        //NSTitledWindowMask
        if ((window.styleMask & 0b000001)>0){
            NSLog("NSTitledWindowMask")
        }
        if (((window.styleMask & 0b000010) >> 1)>0){
            NSLog("NSClosableWindowMask")
        }
        if (((window.styleMask & 0b000100) >> 2)>0){
            NSLog("NSMiniaturizableWindowMask")
        }
        if (((window.styleMask & 0b001000) >> 3)>0){
            NSLog("NSResizableWindowMask")
        }
        
       
        
    }

関連記事(外部サイト)


The Swift Programming Language: Advanced Operators

0xFFAABB形式のデータから各コンポーネントの値を得るようなコードが有る。

The Swift Programming Language: Advanced Operators