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がなくなった。
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!