SSブログ

今日はSwift日和 [MacOSX]

というかやっとMacの前に座る時間ができたので、久しぶりにXcodeブログラミング。Swift以前にXcodeでiOSプログラミングする事自体ほぼ始めてなので知らない事ばかりでしょう。とりあえず、今回はPDFを表示して回転させてみたいと思います。予定は未定ですが。

 
まずプレイグラウンドしかやった事がないので、iOSのプロジェクトを作ってみる。スクリーンショットとか取ろうと思ったけど、そういうぬるいサイトじゃないので(もっとヌルい?)、今後ともヨロシクです。

iOSのApplicationのSingle View Applicationをプロジェクトとして作ってみた。
swiftErr.png
雛形を作って実行しただけでエラーが出たw。意味分からん。Appleなんてこんな物ですよね。もう8割方やる気が失せてますが続けます。

Unable to run app in Simulator
An error was encountered while running (Domain = FBSOpenApplicationErrorDomain, Code = 4)

 http://qiita.com/tajihiro/items/f6f50b56162c93d25c90

>それでもダメな場合は、OS自体を再起動する。

リセットしたら大丈夫でした。何だよこの放置バグw。アップルそんなんばっかだよな。英語のサイトに行ったら、日本のサイトを見ろと書いてあって楽できた。というかqiitaってところよく見るようになった。iOSとか仮想OS関係やHTML5関係とか解決策が多い。どうやって人を集めているんだろう。ひとつのサイトにトラブルシューティングを集約していればかなり人は集まりそうですね。

というか、システムに関わらないのに、OSの再起動とか最近のOSとして有り得ないんですが。とはいえ、未だにWindowsを再起動してどうにかしようとする人が多すぎて嫌だ。それを勧めるインストーラーとかがあるしね。最近は再起動までしなくても何とかなる事が多いけど、いちいち対応するのも面倒なので開発者はOS自体の再起動を求めるんだろう。なんつーか頭の悪い解決方法だよね。スマートさがない。


Swiftのソースらしき雛形コードは、AppDelegate.swiftとViewController.swift。
今までiOSのソースをじっくり眺めた事がないので、Objective-Cのとどこが違うのか分からないですが。
import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

	var window: UIWindow?


	func application(application: UIApplication, didFinishLaunchingWithOptions 
		launchOptions: [NSObject: AnyObject]?) -> Bool {
		// Override point for customization after application launch.
		return true
	}

	func applicationWillResignActive(application: UIApplication) {
		// Sent when the application is about to move from active to inactive state. 
		This can occur for certain types of temporary interruptions (such as 
		an incoming phone call or SMS message) or when the user quits the application
		 and it begins the transition to the background state.
		// Use this method to pause ongoing tasks, disable timers, 
		and throttle down OpenGL ES frame rates. 
		Games should use this method to pause the game.
	}

	func applicationDidEnterBackground(application: UIApplication) {
		// Use this method to release shared resources, save user data, 
		invalidate timers, and store enough application state information
		 to restore your application to its current state in case it is terminated later.
		// If your application supports background execution, 
		this method is called instead of applicationWillTerminate: when the user quits.
	}

	func applicationWillEnterForeground(application: UIApplication) {
		// Called as part of the transition from the background to the inactive state; 
		here you can undo many of the changes made on entering the background.
	}

	func applicationDidBecomeActive(application: UIApplication) {
		// Restart any tasks that were paused (or not yet started) 
		while the application was inactive. If the application was previously 
		in the background, optionally refresh the user interface.
	}

	func applicationWillTerminate(application: UIApplication) {
		// Called when the application is about to terminate. 
		Save data if appropriate. See also applicationDidEnterBackground:.
	}

}


preタグを使っているので、コメントとかを適当なところで改行入れてます。
結局、それぞれの状態の時に、どういう状態になるのかってところですよね。

AppDelegate.swiftについては、各部品というよりか全般的なモノになっているんですが、デリゲートと言うとプログラミング的に言うと少し意味合いが狭まる。
 http://ja.wikipedia.org/wiki/%E5%A7%94%E8%AD%B2
クラスのインスタンスごと参照を丸投げて、他のクラスでやらせるみたいな感じでしょうか。切り分けてるだけと考えていいのかな。

とにかく、delegateでは以下の関数にインプリして挙動を書いていく。ってプログラミングってデータ構造以外は基本挙動のインプリって気はするけど、GUIになってからは特にその傾向は強い。

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { return true }
func applicationWillResignActive(application: UIApplication) { }
func applicationDidEnterBackground(application: UIApplication) { }
func applicationWillEnterForeground(application: UIApplication) { }
func applicationDidBecomeActive(application: UIApplication) { }
func applicationWillTerminate(application: UIApplication) { }


[NSObject: AnyObject]?) -> Bool ってところはObjective-Cっぽい書き方なんだけど、NSObjectのあとのコロンは要らなかった気がするからSwiftの記法なんだろうか。その後の?はswiftっぽい気はするけどね。その後の -> Boolってのも何を示しているのかがよく分からない。C言語で->っていうとポインタで使われる演算子なんだけど、それとは違うのかな。


英語のコメントがずらずら書かれているのでそれを読むと、

・application → アプリ起動時の初期化作業。
・applicationWillResignActive → 割り込みとかで、アプリがアクティブじゃなくなった時。
・applicationDidEnterBackground → バックグラウンドに行った時や、共有リソースを使い終わった時とか、データセーブとか、タイマーを無効化した時とか。
・applicationWillEnterForeground → アプリが戻ってきた時。
・applicationDidBecomeActive → タスクをリスタートした時。
・applicationWillTerminate → アプリを終わらせる時。

って、ちょっとニュアンスが伝わりにくい感じ。実際に使って挙動を見ないとイマイチ掴めない。混同しやすそうな感じの名前なんできっちり調べておく必要はある。


実際のアプリの操作的な挙動を示すのが、ViewController.swiftだと思うんだけど、雛形コードは少ない。まぁみんな実装する物は違うんだろうし、そこにたくさん盛っちゃうのもどうかと思うから良いのだろう。MSのMFCみたいにダラダラ出力されても困るし。

import UIKit

class ViewController: UIViewController {

	override func viewDidLoad() {
		super.viewDidLoad()
		// Do any additional setup after loading the view, typically from a nib.
	}

	override func didReceiveMemoryWarning() {
		super.didReceiveMemoryWarning()
		// Dispose of any resources that can be recreated.
	}

}

どちらの.swiftソースにしても、UIKitは必然的に使うようなので、UIKit自体どこまでやっているのかは知っておかないといけないね。OSXの方ではなかった気がするんだけど、あんまりスクラッチで書いた事ないので、そこいらへんの記憶はうっすらしている。Cocoaもどんなんだったかなぁって感じ。

MVCのコントローラの部分のようですが、そこいらへんの構造はCocoaっぽいですね。ここいらあたりはxibファイルを開いて、ここで書いたファイルを文字通り紐づけていけば良いのかなぁ。とはいえ、ここから何していいかちょっと分からないですね。


このままじゃ埒があかないので、サンプルソースかチュートリアルでも見て先に進みます。今回はPDF回転以前の問題でした。とりあえず、次回までに使えそうなサンプルソースを見つけてきます。ん〜分からんづくしだ。Swiftの書き方が分からないのと、クラスライブラリが分からないのと、Xcodeのお作法がわからないのを切り分けないとあかんな〜。

タグ:SWIFT
コメント(0) 

コメント 0