思い立ったが吉日!

iOSが好きです。

ViewControllerにclosureの変数を持って、閉じる動作を呼出し側から設定する

ViewControllerにclosureの変数を持って、閉じる動作を呼出し側から設定する

複数画面から呼び出される共通画面を作ってる時に、 navigation内にいてpush遷移するパターンと、 navigation外からmodalとして遷移するパターン と言った遷移が違うけど同じ画面で済ませたいときに

遷移先のViewController( CustomViewController )

// 閉じる動作を呼び出し側から設定する
var onClose: ((viewController: UIViewController) -> Void)?

遷移元(呼出し側)のViewController プッシュで遷移

let customVC = CustomViewController()
//
customVC.onClose = { [unowned self] (configFrameViewController) in
        self.navigationController?.popViewControllerAnimated(true)
}

遷移元(呼出し側)のViewController  モーダルで消す

let customVC = CustomViewController()
//
customVC.onClose = { [unowned self] (configFrameViewController) in
        self.dismissViewControllerAnimated(true, completion: nil)
}

Arrayのsort

Arrayのsortメソッドについて

クロージャを使って書くと

let array = [1,3,5,7,0,6,3,3]
let newArray = array.sort { (left, right) -> Bool in
    return left > right
}
print("\(newArray)")

それぞれ比較して>がTrueになるようにソートするので、降順にソートしたarrayが返ります。

同じことを省略して書くと

let array = [1,3,5,7,0,6,3,3]
let newArray = array.sort { $0 > $1 }
print("\(newArray)") 

わかりづらいですが、$0は引数の1個目、$1は引数の2個目を表しています。 上の例と比較すると$0がleft $1がrightと同じ意味になってます。

ちなみに sort()は破壊的メソッドで自身をソートして返す sorted()は破壊的でないメソッドでソートされたコピーを返す

Swift命名規則的には破壊的なメソッドは動詞で、 破壊的でないメソッドはedやingをつけるって勉強会で聞きました。

が、playgroundでsortedを試そうとしたら、出てこなかったし、エラーったので一旦諦めます...

Swiftでのfor文

Swiftでのfor文

swift2.2から

for var i = 0; i < 10 i++ {
}

的な書き方がdepricateになってますね。

慣れ親しんだこの書き方ともオサラバなのは寂しいですが

せっかくの機会なので代替の書き方をまとめておこうと思います。

let array: Array = ["a","b","c","d","e"]

一番簡単なのが

for var str in array {

}

indexとりたいなら

var index = 0
for var str in array {
    index += 1
}

enumurateを使って書くと

for (index, value) in array.enumerate() {
    print("\(index)") // indexが取れる
    print("\(value)") // 値が取れる
}

↑のほうがスマート。

Objective C のenumerateObjectsUsingBlockに当たる奴ですね。

ついでに復習。

[array enumerateObjectsUsingBlock:^(NSString *obj, NSUInteger idx, BOOL *stop) {
    NSLog(@"%d: %@", idx, obj);
}];

Swift3.0でincrement / decrementがdepricateになってる

swift 3.0にてincrement/decrementの書き方が非推奨になるそうで。

for var row = NumRows - 1; row > 0; row-- {
    print("row is \(row)")
}
for var row = NumRows - 1; row > 0; row =- 1 {
    print("row is \(row)")
}

いちいちこう書かなきゃいけないみたい。

でもworningは出続けるので

いっそwhile文で書くと

var row = NumRows-1;
while row>0 {
    row -= 1
}

worningがなくなった。

simulatorが遅くなってハマったとき

xcodeでsimulatorを使ってデバッグしている時に、アニメーションが遅くなってしまい、メモリを疑っしまったけど、simulatorの設定の問題だったので備忘録。

f:id:watarotten:20160329091954p:plain

ココの

f:id:watarotten:20160329092030p:plain

Slow Animationsの設定でsimulatorのアニメーションがゆっくりになるみたいです。

多分command + Tを間違って押していたのだと思います。

もう一度command + Tを押すか、チェックを外してあげれば戻ります。

今回は焦らされただけだけど、アニメーションチェックの時にちゃんと意図したタイミングになっているか確認するときとかに普通に使おう。

MySQLの練習

MySQLの練習

MySQLはhomebrewで入れてます。

Mac へ MySQL を Homebrew でインストールする手順 - Qiita

インストールしたら、とりあえず起動

mysql.server start

停止

mysql.server stop

練習なのでルート権限で入る

mysql -uroot

出る

exit

DBの作成 (goodsというDB)

create database if not exists goods;

goodsというDBを使う

use database goods;

goodsというDBにsales table作成

create table sales (name varchar(10), price int, count int);

goods DBの中にあるテーブルを見る

show tables from goods;

テーブル定義の確認

show full columns from sales;
describe sales;
show fields from sales;

テーブル定義の変更 sales tableのname の定義を変更

alter table sales modify name varchar(20);

カラム追加(最初の列に)

alter table sales add id int first;

カラム追加(nameの後)

alter table sales add country_code char(4) after name;

auto_incrementの設定

alter table sales modify id int auto_increment;

pkの設定

alter table sales add primary key (id);

fkの設定

alter table sales add foreign key(country_code) references countries(country_code);

not null制約の追加

alter table sales modify column name varchar(20) not null;

連続insert

insert into goods.sales (name,country_code, price, count) values ('Strowberry','A001', 280, 3),('Grape','E002',500,2),('Grapefruits','A003',200,4);

Swiftの参照渡しでinoutを使う

Swiftの参照渡しでinoutを使う

Swift書いていたらinoutなるものが出てきて、なんだろうと調べたら参照渡しのようですね。

参照渡し obj-c
-(void)say : (NSString **)str { 
    *str = @"hey!";
}
NSString *saying = @"hello";
NSLog(@"%@",saying); // hello
[self say:&saying]; 
NSLog(@"%@",saying); // 元の変数もhey!になってる
// 値渡し
func test (var str: String) -> String {
    str = "hey"
    return str
}
// 参照渡し
func inoutTest (inout str:String) {
    str = "hey!"
}
var saying = "hello"

print(saying) // hello
// 値渡し
test(saying) // hey!
// 元の変数は書き変わらない
print(saying) // hello
// 参照渡し
inoutTest(&saying) // hey!
// 元の変数も書き換わる
print(saying) hey!