iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
Hackdrライダーにも悩みがある。
燃料計がない単車に乗っているのだが、給油時にトリップメータの値(走行距離)と消費量(給油量)から燃費を計算しないといけない。先ずは、フューエルタンクの容量を把握すること。そして、トリップメータの値から残量を予測し、給油のタイミングを判断することになる。
メーカーから、これの為のアプリが提供されているのだが、WebViewを使った手抜きで、使いづらい。なので、自作することにした。
記録データはサーバ上に置きたいが、自分で立てるのは避けたい。調べたら、iCloud関連が良さそうだ。
利用できるストレージの種類は以下のとおり。
CloudKitを利用することにする。
XcodeのCapabilitiesでCloudKitを有効に設定。
CloudKit Dashboardで形式を定義する。
仮の追加コードを用意して見た。
@IBAction func add(sender: UIButton) {
let privateDatabase : CKDatabase = CKContainer.default().privateCloudDatabase
let refuelRecord: CKRecord = CKRecord(recordType: "Refuels")
refuelRecord["Identifier"] = NSUUID().uuidString as CKRecordValue?
privateDatabase.save(refuelRecord) {
record, error in
if error == nil {
print("Saved : \(record)")
} else {
print("Error : \(error)")
}
}
}
追加した内容を確認するコードだ。
@IBAction func search(sender: UIButton) {
let privateDatabase : CKDatabase = CKContainer.default().privateCloudDatabase
let predicate = NSPredicate(format: "Identifier != %@", "nil")
let query : CKQuery = CKQuery(recordType: "Refuels", predicate: predicate)
privateDatabase.perform(query, inZoneWith: nil, completionHandler: {
results, error in
print("\(results)")
})
}
macOSプログラミングがマイブームだ。手始めに、初期のヒレガス本を最新の開発環境で頭からやってみることにする。
新規プロジェクトを作成。macOSでCocoa Applicationを選択。
以前と異なるのは、以前は自分でアプリケーションのコントローラとなるクラスAppControllerを生成したが、最新の開発環境では、iOSと同様に、AppDelegateとViewControllerが生成済み。
以前ならAppDelegateを選択したと思うが、ViewControllerにコントローラの処理を追加。
AppDelegateは、こんな感じ。
import Cocoa
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(_ aNotification: Notification) {
// Insert code here to initialize your application
}
func applicationWillTerminate(_ aNotification: Notification) {
// Insert code here to tear down your application
}
}
ViewControllerに乱数生成のコードを追加。
import Cocoa
import GameplayKit
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
@IBOutlet var textField: NSTextField?
@IBAction func generate(sender: NSButton) {
let randomNumber = GKRandomSource.sharedRandom().nextInt(upperBound: 99) + 1
textField?.integerValue = randomNumber
}
@IBAction func seed(sender: NSButton) {
textField?.stringValue = "Generator seeded"
}
}
macOSのCocoaプログラミング状況は近年大きく変わった。理由は、iOSのCocoa touchからのフィードバックということになるのだろう。
iPhone SDKが出た時は、UI関連のフレームワークは、OS XとiPhoneで大きく異なったが、最新のフレームワークでは、iOSプログラミングの要領でmacOSプログラミングができるようになっていることに驚くプログラマーも多いと思う。この進化を続けているmacOS Cocoaプログラミングを今のタイミングで入門する際に役立つ情報を集めてみた。
最初に読んだ方が良い、全体を俯瞰する資料といえば、以下だろう。
具体的なコードの説明が足りないため、物足りないが、ある程度の技術が身についた後でも、気づかされる情報が説明されているので、お勧めだ。
macOSプログラミング環境は大きく変わってきている。Swiftもそうだし、ViewControllerなども大きく変わった。市販の書籍もこの進化に追いついていない。でも、逆の見方をすれば、どの書籍も最新の環境にあっていないので、どんな古い書籍でも役立つと言えるのでは?
ということで、著者が選択したのは、昔から人気があったヒレガス本。それも、最初の日本語訳版を頭から最新の環境に読み替えて取り組んでいこうと、個人的に考えている。
この書籍を紹介しているサイトを探したが、古すぎて見つけられなかった。残念。
XcodeのNew Projectで、macOSのCommand Line Tooleを選択する。プロジェクト名は、ヒレガス本の通り"lottery"とする。
ヒレガス本で紹介されていたコードを自分がオーソドックスだと思っているSwiftでコーディングしてみる。
import Foundation
var array = [Int]()
for i in 0..<10 {
let number = i * 3
array.append(number)
}
print(array)
exit(EXIT_SUCCESS)
まず、ヒレガス本でAutoreleasePoolだったのをARCで記述している。
NSNumberは、SwiftのIntの配列とし、var宣言することによって、変更可能としている。
配列に格納されるのは、NSNumberから素直にIntとしている。
最後に、終了時に何もしないとプロセスは0を返すようだが、明示的にexit()を呼んでいる。