Skip to content

Instantly share code, notes, and snippets.

@kenmaz
Last active March 30, 2016 10:51
Show Gist options
  • Save kenmaz/570cd355c194a0440c2bdaf81853a529 to your computer and use it in GitHub Desktop.
Save kenmaz/570cd355c194a0440c2bdaf81853a529 to your computer and use it in GitHub Desktop.

Try!Swift Day1 まとめ

書き起こし

http://niwatako.hatenablog.jp/entry/2016/03/05/022452

===================================================================

Swiftのエコシステムに飛び込む #tryswiftconf Day1-1

http://niwatako.hatenablog.jp/entry/2016/03/02/105937

★聞いてない奴

OSSになっていろいろ動きが

server side swift

IBM bluemix

IBM Kitura

online document

swiftdoc.org

cocoadosc

ところでjazzy

カバレッジ

codecov

#swift related dev tools

パッケージ管理

  • Carthage
  • CococaPods
  • SwiftPackageManager
  • Swift3で正式版

swift and xcode

SourceKit
	SourceKitten : SourceKitのラッパー的なもの
		=> SwiftLint
		=> jazzy
		=> SourceKittenDaemon: いろんなtexteidtorでswiftコード補完サポートするデーモン
			atomとかで使えるサンプルあるらしい

リソース生成

SwiftGen

TEST

Quick, Spectre

  • BDD framework

まとめ

実際に使って、PR投げたりして貢献しよう

Q&A

  • swift package manager => 将来的にxcode統合されるらしいけど、しばらくはcarthage/podどっちも使われる
  • carthageの発音 => カルタゴ、カーセージ、ネイティブでも発音割れてるらしいので、どっちでもOK

===================================================================

実践的クロスプラットフォームSwift

http://niwatako.hatenablog.jp/entry/2016/03/02/105742

  • クロスプラットフォームでswift開発するときのtips
  • いまいちピンときてない

linux dockerでmac上に環境作るのがオススメ

SPM

  • コードを複数のpackage(project)に分けて書くのがオススメ

  • 依存性

  • objc runtimeに依存

  • gcdに依存

  • Darwinに依存

  • #if os(Linux) 的なコード沢山書くことになる

Testing

  • SPMでpackageを作るとTestターゲット作ってくれるようになったよ

CI

  • TravisCI楽でいいよ

========================================================================

コードリーディングについて

http://niwatako.hatenablog.jp/entry/2016/03/02/115920

  • 読み手のことを考えてコードを書こう
  • 流暢なコードがいいとは限らない
  • 10回くらい見ないと規則性が見えないコードX
  • 解読 != 読み取れる
  • 読めることが重要
  • スラングつかわない
  • パターンを使う

========================================================================

AppleTV

http://niwatako.hatenablog.jp/entry/2016/03/02/122740

省略

========================================================================

平常心で型を消し去る

http://niwatako.hatenablog.jp/entry/2016/03/02/125706

具象型と抽象型

具象型

class SomeClass {}
let obj:SomeClass

これはOK

抽象型

class GenericClass<T> {}
let obj:GenericClass<T>

これはNG

  • swiftはTが何なのかわかってないから
  • プレースホルダ型に具象型を埋めればOK
class GenericClass<T> {}
let obj:GenericClass<String>
  • ただしprotocolではこれが不可能 => 共分散

デモ

=> ポケモンの例をplaygroundで

実例:

Javaなら書ける

これはSwiftの言語仕様の問題です。SwiftのprotocolはJavaのinterfaceと違い、クラス実装時の制約であり型ではないためです。

========================================================================

プロトコルと約束の地

http://niwatako.hatenablog.jp/entry/2016/03/02/152738

  • protocol, generics, objcとのmix, いろいろ限界がある

as? lies

let vender = ObjcObject()
let items = vendor.giveMeItems() as? [Fruit] //NG(?)
let items = vendor.giveMeItems().map { $0 as Fruit} //OK(?)

Objective-C側からSwiftにブリッジする時機能しないのです。

  • これはウソのような? 手元では再現できず

header

  • MyApp-Swifth.hはheaderに#importできない

プロトコルコンポジション

objcのUIViewController的なことができない

プロトコルコンポジション使う

protocol A
protocol B
protocol AB: A, B

UIViewController != protocol

  • 解1) UIViewControllerProtocol

  • UIViewControllerにあわせてprotocolを自作 => つらい

  • 解2) computed propertyを使う

  • 結局はas!

Protocol + Generics の辛み

Covariance(共分散)

protocol Holder {
	typealias Item
}

var hoge:Holder //NG

swiftのprotocol+generic は Covariance(共分散) に対応していない(@see also: 型消去)

nest

ネストしたクラスにgenericしていできない(トップレベルだけ)

========================================================================

文化を調和させる

http://niwatako.hatenablog.jp/entry/2016/03/02/160011

sample code

資料

※) suit=スート=トランプのマーク

first_demo

  • apple MVC
  • VCとModelが密結合
  • ビジネスロジックはある程度Modelに
  • cellのsetupもVC

second_demo

  • Handをstruct、immutableに => POP
  • Hand#moveCard => FP
  • CellをCustomCellに => MVVM(?)
  • たぶんCustomCell(CustomCell)クラスがViewModelという扱い?

third_demo

  • HandをDataType protocolに引き上げ
  • DataType = insert/delete/move可能なコレクション
  • その実装 = Hand
  • DataSourceをVCから分離 => VC-Model依存を除去
  • DataSourceは Hand ではなく DataType をpropertyにもつ
  • DataSourceから UITableViewDataSource 実装と、それ以外を分離 => SourceType:UITableViewDataSource
  • SourceType protocol extensionでinsert/delete実装

forth_demo

  • DataSource#addItemTo を SourceTypeに引き上げ、条件判定をconditionForAddingプロトコルメソッドに切り出し
  • テンプレートメソッドパターン
  • OOP的
  • DataSourceのサブクラスHandDataSourceを作成、こちらにHandを依存、DataSourceからHand依存を除去
  • DataSource#conditionForAddingのデフォルト実装がださい

最終的に

  • HandDataStore, CardCell のみが Model(Hand/Card)に依存
  • OOP/POP/FPが調和

========================================================================

HomeKitの話

http://niwatako.hatenablog.jp/entry/2016/03/02/173530

========================================================================

デザインぽい話

http://niwatako.hatenablog.jp/entry/2016/03/02/180745

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment