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

Java8日付API

WEB+DB vol.97 2017の「Java 8で直感的な日付/時間操作」という記事を参考にJava8日付APIを触ってみました。 Java8のDate and Time APIはJoda-Timeに基づいて作られた新しいAPIです。従来のDataやCalendarよりも簡単に日付操作をすることができます。

農業は太陽(太陽暦)、漁業(航海)は月(太陰暦)に関心があるという観点は始めて。興味深い。

リンク

Xcode8でコメント作成

Xcode8では、option + command + /で関数のコメントのひな形をを作成してくれます。便利。

リンク

UILabelのタップイベントを処理する

UILabelのタップイベントを処理して、ラベルに表示する値をアラートダイアログで入力する方法です。

UIラベルのisUserInteractionEnabledをtrueにして、touchesEndedで処理します。

class ViewController: UIViewController {
    let timerLabelTag = 10
    @IBOutlet weak var timerLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        timerLabel.tag = timerLabelTag
        timerLabel.isUserInteractionEnabled = true
    }

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch: UITouch in touches {
            let tag = touch.view!.tag
            if (tag == timerLabelTag) {
                // アラートダイアログで入力する
                let alert = UIAlertController(title: "タイマー時間セットアップ", message: "時間(秒)を入力してください", preferredStyle: .alert)
                let saveAction = UIAlertAction(title: "セット", style: .default) { (action:UIAlertAction!) -> Void in
                    
                    let textField = alert.textFields![0] as UITextField
                    timerLabel = textField.text! 
                    }
                }
                
                let cancelAction = UIAlertAction(title: "キャンセル", style: .default) { (action:UIAlertAction!) -> Void in
                }
                
                // UIAlertControllerにtextFieldを追加
                alert.addTextField { (textField:UITextField!) -> Void in
                }
                
                alert.addAction(saveAction)
                alert.addAction(cancelAction)
                
                present(alert, animated: true, completion: nil)
            }
        }
    }
}

リンク

Excelを使って簡単にINSERT文を作る方法

今参加しているプロジェクトでは、データを挿入してテストすることがあるので、メモしておきます。 やっぱり、一つ一つInsert文を作成するより楽ですね。

リンク

swiftで変数に値が入っているかどうかチェックする

swiftでoptional変数に値が入っている(nilでない)ことをチェックする場合には、以下のようにします。

func isValid(value: String?) -> Bool
    if let _ = 何かの値 {
        return true
    }
    return false
}

_のところに変数にするとXcodeがワーニング(未使用変数)を出すのを回避できます。

iOS GameplayKitを使って見ました

@ITに、「iOS GameplayKitの「Agents, Goals, and Behaviors」で作る、鬼ごっごの鬼AI」という面白そうな記事がありましたので、試してみました。

GameplayKitを初めて使いましたが、簡単に使えるという印象を持ちました。 この連載には、AI的な要素もありそうで今後が楽しみです。

リンク

NotificationCenterを使ってみました

はじめに

iOSアプリで、ある画面で処理したタイミングで別画面の表示を更新したいことがあります。 このような場合には、Observerデザインパターンが有効です。 Observerパターンは、Listenerパターンとも呼ばれます。

Java言語の場合にはListenerをインタフェースとして実装することが多いです。

swiftでは、Observerデザインパターン用のクラスとしてNotificationCenterが提供されています。

ソースコードは、githubにあります。

実装

  • 登録
  • 登録解除
  • 通知を送信
// Notification名を登録する
public extension Notification {
    public static let MyNotificationName = Notification.Name("Notification.MyNotification")
    public static let MyNotificationNameUserInfo = Notification.Name("Notification.MyNotificationUserInfo”)
}
class Hoge : NSObject {
    override init() {
        super.init()
    // 登録
        NotificationCenter.default.addObserver(self, selector: #selector(self.update), name: Notification.MyNotificationName, object: nil);

    // 通知を受けるメソッドです
    func update(notification: NSNotification) {
        print("receive Notification!")
    }

    // 登録解除
    func removeObserver() {
        NotificationCenter.default.removeObserver(self, name: Notification.MyNotificationName, object: nil)
    }
}
var hoge = Hoge()

// 通知する
NotificationCenter.default.post(name: Notification.MyNotificationName object: nil)

通知するタイミングでデータを受け渡したい場合には、UserInfoが使えます。

class HogeUserInfo : NSObject {
    override init() {
        super.init()
        // 受信側(登録)
        NotificationCenter.default.addObserver(self, selector: #selector(self.update), name: MyNotificationNameUserInfo, object: nil)
    }
    
    // 通知を受けるメソッドです
    func update(notification: NSNotification) {
        print("receive Notification!")
        
        guard let userInfo = notification.userInfo,
            let message  = userInfo["message"] as? String,
            let date     = userInfo["date"]    as? Date else {
                print("No userInfo found in notification")
                return
        }
        print(message);
        print(date);
    }
}

var hogeUserInfo = HogeUserInfo()

// 通知する
NotificationCenter.default.post(name: Notification. MyNotificationNameUserInfo, object: nil, userInfo:["message":"Hello there!", "date":Date()])

リンク