Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

Swift bondでつなげてプログラミング

2.988 visualizaciones

Publicado el

2014

Publicado en: Software
  • Sé el primero en comentar

Swift bondでつなげてプログラミング

  1. 1. SwiftBondでつなげてプログ ラミング 山本たかし
  2. 2. 自己紹介 もともとPHP/Javaエンジニア  ↓ 3ヶ月前から急遽iOSエンジニアに転向 facebook: https://www.facebook.com/p.t.yamamoto linkedIn: http://www.linkedin.com/pub/%E8%B2%B4%E5%A3%AB-%E5%B1% B1%E6%9C%AC/57/266/7ba
  3. 3. ソースについて https://github.com/paul-yamamoto/BondExample/ https://github.com/paul-yamamoto/YahooRSS/
  4. 4. SwiftBondとは ● UI部品を拡張して扱いやすくするライブラリ ● TextField label などのデータをつないでくれる。 ● 関数型プログラミングをサポート https://github.com/SwiftBond/Bond インストールはcocoapods が簡単 pod 'Bond', '~> 3.0'
  5. 5. ‘->>’だけでつながる self.textfield ->> self.label ‘<->> ‘と ‘->|’ もある
  6. 6. class ViewController: UIViewController, UITextFieldDelegate { @IBOutlet var textfield : UITextField @IBOutlet var label : UILabel override func viewDidLoad() { super.viewDidLoad() self.textfield.addTarget(self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged) } func textFieldDidChange(id:sender) { self.label.text = self.textfield.text } } class ViewController: UIViewController { @IBOutlet var textfield : UITextField @IBOutlet var label : UILabel override func viewDidLoad() { super.viewDidLoad() self.textfield ->> self.label } } 普通に実現する場合は、 textfieldの状態を監視する処理を入れる必要がある
  7. 7. つなぐ時に処理をはさむ self.textField.dynText.map { "フィールドの値は " + $0 } ->> self.label
  8. 8. mapは何を返しても良い let nameValid = name.dynText.map{countelements($0) > 6} let passValid = pass.dynText.map{countelements($0) > 6} loginButton.dynEnabled = reduce(nameValid, passValid){$0 && $1} reduce(name.dynText, pass.dynText) { return countElements($0) > 6 && countElements($1) > 6 } ->> loginButton.dynEnabled
  9. 9. Dynamic型の処理は繋げて実行できる number.filter { $0 > 10 }.map { "($0)" } ->> label
  10. 10. 肝は Dynamic<T>型 var myString:Dynamic<String> myString ->> self.label
  11. 11. Dynamic型で使える関数型言語機能 func map<T, U>(dynamic: Dynamic<T>, f: T -> U) -> Dynamic<U> Dynamic(配列)型を関数を使い他の Dynamicに変換する func filter<T>(dynamic: Dynamic<T>, f: T -> Bool) -> Dynamic<T> Dynamic(配列)型を関数を使い条件に一致するものだけ取り出す func reduce<A, B, T>(dA: Dynamic<A>, dB: Dynamic<B>, f: (A, B) -> T) -> Dynamic<T> Dynamic(配列)型を関数を使い一つの Dynamic型に集約する
  12. 12. 配列の操作も便利 lazy var loginButtonTapListener = Bond<UIControlEvents>() { event in // ログイン処理 } loginButton.dynEvent.filter(==, .TouchUpInside) ->> loginButtonTapListener
  13. 13. TableにはUtilityクラス self.tableViewDataSourceBond = UITableViewDataSourceBond(tableView: self.tableView) self.news = DynamicArray([]) …. self.news.map { (entry: AnyObject) -> UITableViewCell in let result:NSDictionary = entry as NSDictionary let cell = (self.tableView.dequeueReusableCellWithIdentifier("cell") as? ListViewCell)! let title:Dynamic<String> = Dynamic(result["title"] as String) title ->> cell.label return cell } ->> self.tableViewDataSourceBond cellForRowAtIndexPathとか numbersOfRowinSectionとか必要なし! Tableの状態を気にせず処理を書ける
  14. 14. どういう使い方が良いのか? 状態にごとに処理を書くのでなく、 データをつないで処理を書く。 状態がある → 条件分岐がある → バグの元
  15. 15. どうやって実装してるの? class StepCounter { var totalSteps: Int = 0 { willSet(newTotalSteps) { println("Step (newTotalSteps) が追加されます! ") } didSet { println(" (oldValue) Stepが変更されました! )   println("今は (totalSteps)") } } } propertyObsever 使ってます!
  16. 16. 詳しくは http://five.agency/solving-the-binding- problem-with-swift/ https://github.com/SwiftBond/Bond-Demo- App/

×