SlideShare uma empresa Scribd logo
1 de 95
Baixar para ler offline
ゲンバのSwift
Feb 19, 2015

クラスメソッド株式会社

安達 勇一
安達 勇一
• 2013/12 入社

• TwitterID:   
@UsrNameu1

• Github:   
https://github.com/UsrNameu1

• Blog:   
http://dev.classmethod.jp/
author/yad

•        で連載やって
ます
Topics for today
• UIKitのSelector

• TestでのMock

• iOS7でのSwift OSS 

• Moduleの穴

• 後方互換性
UIKitのSelector
• UIKitのイベントハンドリング

• SwiftでのSelector

• Objective-Cとの比較

• BlocksKit
UIKitでのイベントハンドリング
• UIControl, UIBarButtonItem の target, action
navigationItem.leftBarButtonItem =
UIBarButtonItem(title: NSLocalizedString("cancel", comment: ""),
style: .Bordered,
target: self,
action: Selector(“cancelButtonDidTapped:”));
UIKitでのイベントハンドリング
• UIControl, UIBarButtonItem の target, action
navigationItem.leftBarButtonItem =
UIBarButtonItem(title: NSLocalizedString("cancel", comment: ""),
style: .Bordered,
target: self,
action: Selector(“cancelButtonDidTapped:”));
UIKitでのイベントハンドリング
• UIControl, UIBarButtonItem の target, action
navigationItem.leftBarButtonItem =
UIBarButtonItem(title: NSLocalizedString("cancel", comment: ""),
style: .Bordered,
target: self,
action: Selector(“cancelButtonDidTapped:”));
UIKitのAPIのイベントハンドリングでは
Selectorが要を握る
SwiftでのSelector
• Selectorの定義
struct Selector : StringLiteralConvertible,
NilLiteralConvertible
{ ...
SwiftでのSelector
• Selectorの定義
struct Selector : StringLiteralConvertible,
NilLiteralConvertible
{ ...
"buttonDidTouchUpInside:"リテラルで宣言可能→
SwiftでのSelector
• Selectorの定義
struct Selector : StringLiteralConvertible,
NilLiteralConvertible
{ ...
"buttonDidTouchUpInside:"
Selectorを指定しない時はnilを入れられる→ nil
リテラルで宣言可能→
• リテラルで宣言可能
navigationItem.leftBarButtonItem =
UIBarButtonItem(title: NSLocalizedString("cancel", comment: ""),
style: .Bordered,
target: self,
action: “cancelButtonDidTapped:");
SwiftでのSelector
• Selectorを指定しない時はnilを入れられる
navigationItem.leftBarButtonItem =
UIBarButtonItem(title: NSLocalizedString("cancel", comment: ""),
style: .Bordered,
target: self,
action: nil);
SwiftでのSelector
Objective-Cとの比較
• Objective-C
• Swift
[removeButton addTarget:self
action:@selector(removeButtonDidTouchUpInside:)
forControlEvents:UIControlEventTouchUpInside];
removeButton.addTarget(self,
action: Selector("removeButtonDidTouchUpInside:"),
forControlEvents: .TouchUpInside)
Objective-Cとの比較
• Objective-C
• Swift
[removeButton addTarget:self
action:@selector(removeButtonDidTouchUpInside:)
forControlEvents:UIControlEventTouchUpInside];
removeButton.addTarget(self,
action: Selector("removeButtonDidTouchUpInside:"),
forControlEvents: .TouchUpInside)
⇧Selector名が間違っていたら
コンパイラが警告を出してくれる
Objective-Cとの比較
• Objective-C
• Swift
[removeButton addTarget:self
action:@selector(removeButtonDidTouchUpInside:)
forControlEvents:UIControlEventTouchUpInside];
removeButton.addTarget(self,
action: Selector("removeButtonDidTouchUpInside:"),
forControlEvents: .TouchUpInside)
⇧Selector名が間違っていたら
コンパイラが警告を出してくれる
⇧Selector名が間違っていても
コンパイラは警告を出してくれない
Objective-Cとの比較
• Objective-C
• Swift
[removeButton addTarget:self
action:@selector(removeButtonDidTouchUpInside:)
forControlEvents:UIControlEventTouchUpInside];
removeButton.addTarget(self,
action: Selector("removeButtonDidTouchUpInside:"),
forControlEvents: .TouchUpInside)
⇧Selector名が間違っていたら
コンパイラが警告を出してくれる
⇧Selector名が間違っていても
コンパイラは警告を出してくれない
BlocksKit
• Podfile
• Brigdeing Header
pod 'BlocksKit/UIKit'
#import <BlocksKit/BlocksKit+UIKit.h>
BlocksKit
• Before
removeButton.addTarget(self,
action: Selector("removeButtonDidTouchUpInside:"),
forControlEvents: .TouchUpInside)
⇧Selector名が間違っていても
コンパイラは警告を出してくれない
BlocksKit
• Before
• After
removeButton.addTarget(self,
action: Selector("removeButtonDidTouchUpInside:"),
forControlEvents: .TouchUpInside)
⇧Selector名が間違っていても
コンパイラは警告を出してくれない
removeButton.bk_addEventHandler({[weak self] sender in
self?.removeButtonDidTouchUpInside(sender)
return Void()
}, forControlEvents: .TouchUpInside)
⇧ハンドラの中でメソッドを直に呼び出すため、
メソッド名が間違っていたらコンパイラはエラーになる
• 循環参照によるリーク
BlocksKit
• weak, unownedで解決
BlocksKit
removeButton.bk_addEventHandler({[weak self] sender in
self?.removeButtonDidTouchUpInside(sender)
return Void()
}, forControlEvents: .TouchUpInside)
• weak, unownedで解決
BlocksKit
removeButton.bk_addEventHandler({[weak self] sender in
self?.removeButtonDidTouchUpInside(sender)
return Void()
}, forControlEvents: .TouchUpInside)
・ weak : selfがなくなった後もアクセスされる場合
・ unowned : selfがなくなった後にアクセスされない場合
TestでのMock
• iOSでのテスト実施

• 2つのFramework :
Quick, Nimble

• SwiftでのMock実現方法
iOSでのテスト実施
• 設計、実装の手助けの為
• Model層に対して実施
• 挙動が明らかなもの(イニシャライザ等)については
省略した
2つのFramework : Quick, Nimble
• QuickはテストのためのBDD流DSLを用意
• Nimbleは実際の値と期待する値を比較するマッチャー
• テストはプロダクトコードに含まれない為、    
iOS 8 向けにインストール
2つのFramework : Quick, Nimble
• 病院にかかわる一連のモデル
create
confirm
use
public struct Diagnosis {
public let name: String
public init(name: String) {
self.name = name
}
}
public protocol Examinable {
func examine() -> Diagnosis
}
public class Doctor: Examinable {
public init() {}
public func examine() -> Diagnosis {
return Diagnosis(name: "cold")
}
}
public class Hospital {
private let examinable: Examinable
public init(examinable: Examinable) {
self.examinable = examinable
}
public func serve() -> Diagnosis {
return examinable.examine()
}
}
https://github.com/UsrNameu1/QuickStudy
2つのFramework : Quick, Nimble
• 診断データ型
public struct Diagnosis {
public let name: String
public init(name: String) {
self.name = name
}
}
2つのFramework : Quick, Nimble
• 診断者プロトコル
public protocol Examinable {
func examine() -> Diagnosis
}
2つのFramework : Quick, Nimble
• 医者クラス
public class Doctor: Examinable {
public init() {}
public func examine() -> Diagnosis {
return Diagnosis(name: "cold")
}
}
2つのFramework : Quick, Nimble
• 病院クラス
public class Hospital {
private let examinable: Examinable
public init(examinable: Examinable) {
self.examinable = examinable
}
public func serve() -> Diagnosis {
return examinable.examine()
}
}
2つのFramework : Quick, Nimble
• BDD Example
class HospitalSpecs: QuickSpec {
override func spec() {
describe("病院の診断について") {
context("診察できる人が診断を行うとき") {
let doctor = Doctor()
let hospital = Hospital(examinable: doctor)
it("診察できる人の診断を返すこと。") {
expect(hospital.serve().name) == "cold"
}
}
}
}
}
SwiftでのMock実装例
class HospitalSpecs: QuickSpec { // protocol準拠でMockを使う
override func spec() {
describe("病院の診断について") {
context("診察できる人が診断を行うとき") {
class MockExaminable: Examinable {
override func examine() -> Diagnosis {
return Diagnosis(name: "cold")
}
}
let mock = MockExaminable()
let hospital = Hospital(examinable: mock)
it("診察できる人の診断を返すこと。") {
expect(hospital.serve().name) == "cold"
}
}
}
}
}
SwiftでのMock実装例
class HospitalSpecs: QuickSpec { // protocol準拠でMockを使う
override func spec() {
describe("病院の診断について") {
context("診察できる人が診断を行うとき") {
class MockExaminable: Examinable {
override func examine() -> Diagnosis {
return Diagnosis(name: "cold")
}
}
let mock = MockExaminable()
let hospital = Hospital(examinable: mock)
it("診察できる人の診断を返すこと。") {
expect(hospital.serve().name) == "cold"
}
}
}
}
}
SwiftでのMock実装例
class HospitalSpecs: QuickSpec { // 継承でMockを使う
override func spec() {
describe("病院の診断について") {
context("診察できる人が診断を行うとき") {
class MockDoctor: Doctor {
override func examine() -> Diagnosis {
return Diagnosis(name: "headache")
}
} // HospitalがDoctorを直接用いている時も使える
let mock = MockDoctor()
let hospital = Hospital(examinable: mock)
it("診察できる人の診断を返すこと。") {
expect(hospital.serve().name) == "headache"
}
}
}
}
}
SwiftでのMock実装例
class HospitalSpecs: QuickSpec { // 継承でMockを使う
override func spec() {
describe("病院の診断について") {
context("診察できる人が診断を行うとき") {
class MockDoctor: Doctor {
override func examine() -> Diagnosis {
return Diagnosis(name: "headache")
}
} // HospitalがDoctorを直接用いている時も使える
let mock = MockDoctor()
let hospital = Hospital(examinable: mock)
it("診察できる人の診断を返すこと。") {
expect(hospital.serve().name) == "headache"
}
}
}
}
}
SwiftでのMock実装例
• protocol, subclassは一長一短
• protocol準拠のMockの場合、@objc とoptionalをつけな
い限り必須実装をモックにもれなく実装する必要があ
る
• subclassのMockの場合、ネストの深い箇所では
Segmentation fault 11が起こるケースがあった
iOS7でのSwift OSS
• OSSのインストール

• iOS7でOSSを使う

• 使用中のOSS
OSSのインストール
• git submodule
• Cocoapods (0.36以上)
• Carthage
OSSのインストール
• git submodule
• Cocoapods (0.36以上)
• Carthage
←プロジェクトではこれを利用
←iOS8以降
←iOS8以降
OSSのインストール
• git submodule でのOSS導入例(Alamofire)
$ cd (Project dir)
$ git submodule add https://github.com/
Alamofire/Alamofire.git
詳しくはWebで! 
http://dev.classmethod.jp/references/swift-oss-
alamofire-1/
iOS7でOSSを使う
https://github.com/CocoaPods/swift/issues/9
iOS7でOSSを使う
iOS7でOSSを使う
https://github.com/CocoaPods/swift/issues/9
iOS7でOSSを使う
• iOS8 では Dynamic Library の形式では使えないので直
にソースファイルをプロジェクトに入れる必要がある
• 極力 git submodule の更新のみでファイル追従を行うた
めにCopyせずにソースファイルへの参照をリンク
iOS7でOSSを使う
iOS7でOSSを使う
チェックを外して参照のみ保持
使用中のOSS
• Alamofire : HTTP通信のためのOSS
• SwiftyJSON : JSONハンドリングのためのOSS
• BrightFutures : 非同期処理のためのOSS
• Quick : テストのDSLを提供するOSS
• Nimble : テストのマッチャ−を提供するOSS
• Alamofire
• SwiftyJson
• BrightFutures
• Quick
• Nimble
テストターゲットのみに含まれる為、
テストをiOS8向けとして
Dynamic frameworkでプロジェクトに入れた
使用中のOSS
• Alamofire
• SwiftyJson
• BrightFutures
• Quick
• Nimble
テストターゲットのみに含まれる為、
テストをiOS8向けとして
Dynamic frameworkでプロジェクトに入れた
アプリターゲットの対象に
iOS7が含まれるため
frameworkとしてではなく、
ソースの参照を保持するようにした
使用中のOSS
使用中のOSS : Alamofire
https://github.com/Alamofire/Alamofire
使用中のOSS : Alamofire
https://github.com/Alamofire/Alamofire
使用中のOSS : SwiftyJSON
https://github.com/SwiftyJSON/SwiftyJSON
使用中のOSS : SwiftyJSON
https://github.com/SwiftyJSON/SwiftyJSON
使用中のOSS : BrightFutures
https://github.com/Thomvis/BrightFutures
使用中のOSS : BrightFutures
https://github.com/Thomvis/BrightFutures
• Before
User.logIn(username, password) { user, error in
if !error {
Posts.fetchPosts(user, success: { posts in
// do something with the user's posts
}, failure: handleError)
} else {
// handeError is a custom function to handle errors
handleError(error)
}
}
使用中のOSS : BrightFutures
https://github.com/Thomvis/BrightFutures
• After
User.logIn(username,password).flatMap { user in
Posts.fetchPosts(user)
}.onSuccess { posts in
// do something with the user's posts
}.onFailure { error in
// either logging in or fetching posts failed
}
Moduleの穴
• クラス名だけを文字列で取
得する

• NSManagedObject in Test

• Storyboard & InterfaceBuiler
クラス名だけを文字列で取得する
• SwiftでNSObjectのクラス名を取得する際にはモジュー
ル名も含まれる
クラス名だけを文字列で取得する
// モジュール名.Sample が得られる
let nameWithModule = NSStringFromClass(Sample.self)
// Sampleのみを取得したい
let nameWithoutModule = Sample.nameForClass
クラス名だけを文字列で取得する
• SwiftでNSObjectのクラス名を取得する際にはモジュー
ル名も含まれる
• 従来のクラス名取得機能についてはエクステンション
で実装
クラス名だけを文字列で取得する
extension NSObject {
/// クラス名をモジュール名を取り除いて取得します。
public class var nameForClass: String {
return NSStringFromClass(self)
.componentsSeparatedByString(".").last!
}
}
NSManagedObject in Test
• NSManagedObjectサブクラスを用いたクラスのテスト
で実行時に落ちる
NSManagedObject in Test
• NSManagedObjectサブクラスを用いたクラスのテスト
で実行時に落ちる
*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: 'executeFetchRequest:error: A fetch request must have an entity.'
*** First throw call stack:
(
0 CoreFoundation 0x000000010387ef35 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x0000000103517bb7 objc_exception_throw + 45
2 CoreData 0x00000001025e137d -[NSManagedObjectContext
executeFetchRequest:error:] + 4541
NSManagedObject in Test
• NSManagedObjectサブクラスを用いたクラスのテスト
で実行時に落ちる
• Objective-Cから見た時のNSObjectサブクラス名もSwift
のクラスに対してはModule名.クラス名
• @objc()キーワードを使ってObjective-Cから見た時の
NSObjectサブクラス名を変更する
NSManagedObject in Test
• Before
class Product: NSManagedObject {
@NSManaged var name: String
}
NSManagedObject in Test
• Before
• After
class Product: NSManagedObject {
@NSManaged var name: String
}
@objc(Product)
class Product: NSManagedObject {
@NSManaged var name: String
}
NSManagedObject in Test
• Before
• After
class Product: NSManagedObject {
@NSManaged var name: String
}
@objc(Product)
class Product: NSManagedObject {
@NSManaged var name: String
}
@objc()キーワードを使ってObjective-Cから見た
時のNSObjectサブクラス名を変更
Storyboard & InterfaceBuilder
• Storyboardで定義したInitialViewControllerに接続した
UINavigationControllerのrootViewControllerがうまく初期
化されない
Storyboard & InterfaceBuilder
• Xcode 6 より追加されたModule入力欄にターゲットモ
ジュールを入力
• またはViewController宣言の前に            
@objcでObjective-Cから見た            
クラス名を記述
http://stackoverflow.com/questions/
24924966/xcode-6-strange-bug-
unknown-class-in-interface-builder-file 
後方互換性
• CIとマイナーアップデート

• Swift 1.2

• Chris Lattnerの哲学
CIとマイナーアップデート
• CIサービスはTravisを利用
• Xcodeのマイナーアップデート6.1.0 →6.1.1によるトラ
ブル (Travis側がデフォルトで6.1.0だった)
CIとマイナーアップデート
• Travisがすぐに対応してくれた
• Twitterのアカウントで最新情報にキャッチアップ
https://twitter.com/travisci
osx_image: xcode611
CIとマイナーアップデート
• 0.0.1単位のマイナーアップデートでも      
XcodeでOptionalの変更がよくある
CIとマイナーアップデート
• 0.0.1単位のマイナーアップデートでも      
XcodeでOptionalの変更がよくある
例
var textLabel: UILabel? { get }
var textLabel: UILabel! { get } Xcode 6.1.0
Xcode 6.1.1
Swift 1.2
• Incremental Buildが実現!
• より便利になった if let !
• 集合データ構造Set<T>! 
Swift 1.2
• Incremental Buildが実現!
• より便利になった if let !
• 集合データ構造Set<T>! 
• Objective-Cの諸クラスからの暗黙的型変換禁止!
Swift 1.2
• Objective-Cの諸クラスからの暗黙的型変換禁止!
func mangleString(input: String) {
// do something with input
}
let someString: NSString = "hello"
mangleString(someString) // compile error!
Swift 1.2
• Objective-Cの諸クラスからの暗黙的型変換禁止!
func mangleString(input: String) {
// do something with input
}
let someString: NSString = "hello"
mangleString(someString as! String)
Chris Lattnerの哲学
• Chris Lattner:Swiftつくった人
• コンパイラ基盤LLVMの作者でもある
Chris Lattnerの哲学
• The Architecture of Open Source
Applications : Chapter 11 LLVM
• 邦語訳へのリンク
http://m-takagi.github.io/aosa-ja/
Chris Lattnerの哲学
もうひとつ、LLVMを軽量なままに保ち続けている大きな特徴がある
(ライブラリを使うクライアント側から見ると賛否両論がある)。
それは、過去の決断も積極的に見直して、過去との互換性を気にせずにAPIを
大きく変更していくということだ。
たとえばLLVM IR自体に大幅な変更を加えるには、すべての最適化パスの変更
が必要になる。
そしてそれは、C++のAPIにも大きな影響を及ぼす。
LLVMでは過去に何度かそういうことがあった。
クライアント側にとっては辛かっただろうが、今後の開発を順調に進めていく
ためにはそうすべきだった。
Chris Lattnerの哲学
もうひとつ、LLVMを軽量なままに保ち続けている大きな特徴がある
(ライブラリを使うクライアント側から見ると賛否両論がある)。
それは、過去の決断も積極的に見直して、過去との互換性を気にせずにAPIを
大きく変更していくということだ。
たとえばLLVM IR自体に大幅な変更を加えるには、すべての最適化パスの変更
が必要になる。
そしてそれは、C++のAPIにも大きな影響を及ぼす。
LLVMでは過去に何度かそういうことがあった。
クライアント側にとっては辛かっただろうが、今後の開発を順調に進めていく
ためにはそうすべきだった。
過去の決断も積極的に見直して
過去との互換性を気にせずに
APIを大きく変更していく
Swift発表時
Swift発表時
Swiftプロジェクト
開始直後
Swift発表時
Swiftプロジェクト
開始直後
現在!
Chris Lattnerの哲学
ここまではなんとかうまくやってきたが、まだやり残したことは多い。
さらに、今後LLVMが年を重ねるにつれて、軽快さが失われて硬直化してしま
うというリスクもある。
この問題には魔法のような解決策があるわけではない。
でも、新しい問題領域を公開し続けていることや
過去の決断を躊躇せず再考していること、
さらに再設計で過去のコードを捨てられるようにしていることなどが、
すこしでもその対策になって欲しいものだ。
結局のところ、パーフェクトな存在を目指すのではなく、常に向上し続ける
ことが大切なのだ。
Chris Lattnerの哲学
ここまではなんとかうまくやってきたが、まだやり残したことは多い。
さらに、今後LLVMが年を重ねるにつれて、軽快さが失われて硬直化してしま
うというリスクもある。
この問題には魔法のような解決策があるわけではない。
でも、新しい問題領域を公開し続けていることや
過去の決断を躊躇せず再考していること、
さらに再設計で過去のコードを捨てられるようにしていることなどが、
すこしでもその対策になって欲しいものだ。
結局のところ、パーフェクトな存在を目指すのではなく、常に向上し続ける
ことが大切なのだ。
過去の決断を躊躇せず再考
パーフェクトな存在を目指すの
ではなく、常に向上し続けるこ
とが大切
ゲンバのSwift

Mais conteúdo relacionado

Mais procurados

[Ps11]ネットワーク第4回
[Ps11]ネットワーク第4回[Ps11]ネットワーク第4回
[Ps11]ネットワーク第4回Yukiko Kato
 
Java SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRubyJava SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRubyHiroshi Nakamura
 
Paging Libraryの利用をやめたいお気持ち表明
Paging Libraryの利用をやめたいお気持ち表明Paging Libraryの利用をやめたいお気持ち表明
Paging Libraryの利用をやめたいお気持ち表明furusin
 
Xtend30分クッキング
Xtend30分クッキングXtend30分クッキング
Xtend30分クッキングShinichi Kozake
 
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとりVue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとりYuta Ohashi
 
はじめてのCouch db
はじめてのCouch dbはじめてのCouch db
はじめてのCouch dbEiji Kuroda
 
LINQソースでGO!
LINQソースでGO!LINQソースでGO!
LINQソースでGO!Kouji Matsui
 
Weeyble async 181009_tukky
Weeyble async 181009_tukkyWeeyble async 181009_tukky
Weeyble async 181009_tukkyshotaueda3
 

Mais procurados (11)

[Ps11]ネットワーク第4回
[Ps11]ネットワーク第4回[Ps11]ネットワーク第4回
[Ps11]ネットワーク第4回
 
Blocksの活用法
Blocksの活用法Blocksの活用法
Blocksの活用法
 
Java SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRubyJava SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRuby
 
Paging Libraryの利用をやめたいお気持ち表明
Paging Libraryの利用をやめたいお気持ち表明Paging Libraryの利用をやめたいお気持ち表明
Paging Libraryの利用をやめたいお気持ち表明
 
Xtend30分クッキング
Xtend30分クッキングXtend30分クッキング
Xtend30分クッキング
 
Backbone.js
Backbone.jsBackbone.js
Backbone.js
 
OSC京都2011
OSC京都2011OSC京都2011
OSC京都2011
 
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとりVue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
 
はじめてのCouch db
はじめてのCouch dbはじめてのCouch db
はじめてのCouch db
 
LINQソースでGO!
LINQソースでGO!LINQソースでGO!
LINQソースでGO!
 
Weeyble async 181009_tukky
Weeyble async 181009_tukkyWeeyble async 181009_tukky
Weeyble async 181009_tukky
 

Destaque

Google Maps を使ったアプリを作ってみた
Google Maps を使ったアプリを作ってみたGoogle Maps を使ったアプリを作ってみた
Google Maps を使ったアプリを作ってみたShigeki Yamato
 
KotlinつかってQiitaクライアント作った時の話
KotlinつかってQiitaクライアント作った時の話KotlinつかってQiitaクライアント作った時の話
KotlinつかってQiitaクライアント作った時の話shinnosuke kugimiya
 
マジックビーンズ
マジックビーンズマジックビーンズ
マジックビーンズAkira Suenami
 
iOS 9 Bootcamp #6 UIKit
iOS 9 Bootcamp #6 UIKitiOS 9 Bootcamp #6 UIKit
iOS 9 Bootcamp #6 UIKitShingo Hiraya
 
SQLiteDatabaseを無理矢理覗く
SQLiteDatabaseを無理矢理覗くSQLiteDatabaseを無理矢理覗く
SQLiteDatabaseを無理矢理覗くTakao Sumitomo
 
How to measure UIView position on Native App
How to measure UIView position on Native AppHow to measure UIView position on Native App
How to measure UIView position on Native AppDaisuke Yamashita
 
Isucon makers casual talks
Isucon makers casual talksIsucon makers casual talks
Isucon makers casual talksMasahiro Nagano
 
AppStore申請を一式まるっと自動化する
AppStore申請を一式まるっと自動化するAppStore申請を一式まるっと自動化する
AppStore申請を一式まるっと自動化するTomoki Hasegawa
 
殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜
殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜
殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜Shuichi Tsutsumi
 
意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)
意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)
意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)将之 小野
 
クラウドセキュリティ基礎 #seccamp
クラウドセキュリティ基礎 #seccampクラウドセキュリティ基礎 #seccamp
クラウドセキュリティ基礎 #seccampMasahiro NAKAYAMA
 
【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)
【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)
【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)Hiroyuki Kusu
 
Activity, Fragment, CustomView の使い分け - マッチョなActivityにさよならする方法 -
Activity, Fragment, CustomView の使い分け - マッチョなActivityにさよならする方法 -Activity, Fragment, CustomView の使い分け - マッチョなActivityにさよならする方法 -
Activity, Fragment, CustomView の使い分け - マッチョなActivityにさよならする方法 -Yuki Anzai
 
Android学ぶを君へ。生き抜くためのナレッジ共有
Android学ぶを君へ。生き抜くためのナレッジ共有Android学ぶを君へ。生き抜くためのナレッジ共有
Android学ぶを君へ。生き抜くためのナレッジ共有Shinobu Okano
 
絶対落ちないアプリの作り方
絶対落ちないアプリの作り方絶対落ちないアプリの作り方
絶対落ちないアプリの作り方Fumihiko Shiroyama
 

Destaque (17)

Em synchrony について
Em synchrony についてEm synchrony について
Em synchrony について
 
Google Maps を使ったアプリを作ってみた
Google Maps を使ったアプリを作ってみたGoogle Maps を使ったアプリを作ってみた
Google Maps を使ったアプリを作ってみた
 
KotlinつかってQiitaクライアント作った時の話
KotlinつかってQiitaクライアント作った時の話KotlinつかってQiitaクライアント作った時の話
KotlinつかってQiitaクライアント作った時の話
 
マジックビーンズ
マジックビーンズマジックビーンズ
マジックビーンズ
 
iOS 9 Bootcamp #6 UIKit
iOS 9 Bootcamp #6 UIKitiOS 9 Bootcamp #6 UIKit
iOS 9 Bootcamp #6 UIKit
 
SQLiteDatabaseを無理矢理覗く
SQLiteDatabaseを無理矢理覗くSQLiteDatabaseを無理矢理覗く
SQLiteDatabaseを無理矢理覗く
 
How to measure UIView position on Native App
How to measure UIView position on Native AppHow to measure UIView position on Native App
How to measure UIView position on Native App
 
Isucon makers casual talks
Isucon makers casual talksIsucon makers casual talks
Isucon makers casual talks
 
AppStore申請を一式まるっと自動化する
AppStore申請を一式まるっと自動化するAppStore申請を一式まるっと自動化する
AppStore申請を一式まるっと自動化する
 
殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜
殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜
殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜
 
意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)
意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)
意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)
 
クラウドセキュリティ基礎 #seccamp
クラウドセキュリティ基礎 #seccampクラウドセキュリティ基礎 #seccamp
クラウドセキュリティ基礎 #seccamp
 
【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)
【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)
【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)
 
Activity, Fragment, CustomView の使い分け - マッチョなActivityにさよならする方法 -
Activity, Fragment, CustomView の使い分け - マッチョなActivityにさよならする方法 -Activity, Fragment, CustomView の使い分け - マッチョなActivityにさよならする方法 -
Activity, Fragment, CustomView の使い分け - マッチョなActivityにさよならする方法 -
 
Android学ぶを君へ。生き抜くためのナレッジ共有
Android学ぶを君へ。生き抜くためのナレッジ共有Android学ぶを君へ。生き抜くためのナレッジ共有
Android学ぶを君へ。生き抜くためのナレッジ共有
 
Play_using_Proxy
Play_using_ProxyPlay_using_Proxy
Play_using_Proxy
 
絶対落ちないアプリの作り方
絶対落ちないアプリの作り方絶対落ちないアプリの作り方
絶対落ちないアプリの作り方
 

Semelhante a ゲンバのSwift

「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)Fujio Kojima
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~normalian
 
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"Michio Koyama
 
RuntimeUnitTestToolkit for Unity
RuntimeUnitTestToolkit for UnityRuntimeUnitTestToolkit for Unity
RuntimeUnitTestToolkit for UnityYoshifumi Kawai
 
Android test tutorial
Android test tutorialAndroid test tutorial
Android test tutorialKazuaki Ueda
 
named_scope more detail - WebCareer
named_scope more detail - WebCareernamed_scope more detail - WebCareer
named_scope more detail - WebCareerKyosuke MOROHASHI
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSAyumi Goto
 
Unit test in android
Unit test in androidUnit test in android
Unit test in androidTatsuya Maki
 
[db tech showcase Tokyo 2017] D15: ビッグデータ x 機械学習の高速分析をVerticaで実現!by ヒューレット・パッ...
[db tech showcase Tokyo 2017] D15: ビッグデータ x 機械学習の高速分析をVerticaで実現!by ヒューレット・パッ...[db tech showcase Tokyo 2017] D15: ビッグデータ x 機械学習の高速分析をVerticaで実現!by ヒューレット・パッ...
[db tech showcase Tokyo 2017] D15: ビッグデータ x 機械学習の高速分析をVerticaで実現!by ヒューレット・パッ...Insight Technology, Inc.
 
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsugSpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsugToshiaki Maki
 
Tokyo GTUG Bootcamp2010
Tokyo GTUG Bootcamp2010Tokyo GTUG Bootcamp2010
Tokyo GTUG Bootcamp2010Takashi EGAWA
 
Angular2 rc.1 unit testing overview
Angular2 rc.1 unit testing overviewAngular2 rc.1 unit testing overview
Angular2 rc.1 unit testing overviewMitsuru Ogawa
 
TDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaTDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaYuta Kawadai
 
elasticsearchソースコードを読みはじめてみた
elasticsearchソースコードを読みはじめてみたelasticsearchソースコードを読みはじめてみた
elasticsearchソースコードを読みはじめてみたfurandon_pig
 
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~Akira Inoue
 
jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortemtamtam180
 
Layout analyzerでのgroovyの利用について
Layout analyzerでのgroovyの利用についてLayout analyzerでのgroovyの利用について
Layout analyzerでのgroovyの利用についてkimukou_26 Kimukou
 

Semelhante a ゲンバのSwift (20)

「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
 
CLRH_120414_WFTDD
CLRH_120414_WFTDDCLRH_120414_WFTDD
CLRH_120414_WFTDD
 
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
 
Road to UI Library
Road to UI LibraryRoad to UI Library
Road to UI Library
 
RuntimeUnitTestToolkit for Unity
RuntimeUnitTestToolkit for UnityRuntimeUnitTestToolkit for Unity
RuntimeUnitTestToolkit for Unity
 
Android test tutorial
Android test tutorialAndroid test tutorial
Android test tutorial
 
named_scope more detail - WebCareer
named_scope more detail - WebCareernamed_scope more detail - WebCareer
named_scope more detail - WebCareer
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJS
 
Unit test in android
Unit test in androidUnit test in android
Unit test in android
 
[db tech showcase Tokyo 2017] D15: ビッグデータ x 機械学習の高速分析をVerticaで実現!by ヒューレット・パッ...
[db tech showcase Tokyo 2017] D15: ビッグデータ x 機械学習の高速分析をVerticaで実現!by ヒューレット・パッ...[db tech showcase Tokyo 2017] D15: ビッグデータ x 機械学習の高速分析をVerticaで実現!by ヒューレット・パッ...
[db tech showcase Tokyo 2017] D15: ビッグデータ x 機械学習の高速分析をVerticaで実現!by ヒューレット・パッ...
 
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsugSpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
 
Tokyo GTUG Bootcamp2010
Tokyo GTUG Bootcamp2010Tokyo GTUG Bootcamp2010
Tokyo GTUG Bootcamp2010
 
Angular2 rc.1 unit testing overview
Angular2 rc.1 unit testing overviewAngular2 rc.1 unit testing overview
Angular2 rc.1 unit testing overview
 
TDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaTDD勉強会キックオフ for Java
TDD勉強会キックオフ for Java
 
elasticsearchソースコードを読みはじめてみた
elasticsearchソースコードを読みはじめてみたelasticsearchソースコードを読みはじめてみた
elasticsearchソースコードを読みはじめてみた
 
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
 
jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortem
 
Boost tour 1_40_0
Boost tour 1_40_0Boost tour 1_40_0
Boost tour 1_40_0
 
Layout analyzerでのgroovyの利用について
Layout analyzerでのgroovyの利用についてLayout analyzerでのgroovyの利用について
Layout analyzerでのgroovyの利用について
 

Mais de Yuichi Adachi

Seminar on Quantum Computation & Quantum Information part28
Seminar on Quantum Computation & Quantum Information part28Seminar on Quantum Computation & Quantum Information part28
Seminar on Quantum Computation & Quantum Information part28Yuichi Adachi
 
Swift2.x を Scala からみる
Swift2.x を Scala からみるSwift2.x を Scala からみる
Swift2.x を Scala からみるYuichi Adachi
 
Swift2 の新機能 Protocol Extension
Swift2 の新機能 Protocol ExtensionSwift2 の新機能 Protocol Extension
Swift2 の新機能 Protocol ExtensionYuichi Adachi
 
Seminar on Quantum Computation & Quantum Information part19
Seminar on Quantum Computation & Quantum Information part19Seminar on Quantum Computation & Quantum Information part19
Seminar on Quantum Computation & Quantum Information part19Yuichi Adachi
 
続・ゲンバのSwift
続・ゲンバのSwift続・ゲンバのSwift
続・ゲンバのSwiftYuichi Adachi
 
Seminar on Quantum Computation & Quantum Information part15
Seminar on Quantum Computation & Quantum Information part15Seminar on Quantum Computation & Quantum Information part15
Seminar on Quantum Computation & Quantum Information part15Yuichi Adachi
 
Seminar on Quantum Computation & Quantum Information part14
Seminar on Quantum Computation & Quantum Information part14Seminar on Quantum Computation & Quantum Information part14
Seminar on Quantum Computation & Quantum Information part14Yuichi Adachi
 
VIPER アーキテクチャによる iOS アプリの設計
VIPER アーキテクチャによる iOS アプリの設計VIPER アーキテクチャによる iOS アプリの設計
VIPER アーキテクチャによる iOS アプリの設計Yuichi Adachi
 
[iOS8] 新たな線形代数ライブラリ Linear Algebra
[iOS8] 新たな線形代数ライブラリ Linear Algebra[iOS8] 新たな線形代数ライブラリ Linear Algebra
[iOS8] 新たな線形代数ライブラリ Linear AlgebraYuichi Adachi
 
Swiftの新機能 Optional
Swiftの新機能 OptionalSwiftの新機能 Optional
Swiftの新機能 OptionalYuichi Adachi
 
ユニットテスト初学者がKiwiFramework非同期テストで失敗した
ユニットテスト初学者がKiwiFramework非同期テストで失敗したユニットテスト初学者がKiwiFramework非同期テストで失敗した
ユニットテスト初学者がKiwiFramework非同期テストで失敗したYuichi Adachi
 

Mais de Yuichi Adachi (12)

Seminar on Quantum Computation & Quantum Information part28
Seminar on Quantum Computation & Quantum Information part28Seminar on Quantum Computation & Quantum Information part28
Seminar on Quantum Computation & Quantum Information part28
 
Swift2.x を Scala からみる
Swift2.x を Scala からみるSwift2.x を Scala からみる
Swift2.x を Scala からみる
 
Swift2 の新機能 Protocol Extension
Swift2 の新機能 Protocol ExtensionSwift2 の新機能 Protocol Extension
Swift2 の新機能 Protocol Extension
 
Seminar on Quantum Computation & Quantum Information part19
Seminar on Quantum Computation & Quantum Information part19Seminar on Quantum Computation & Quantum Information part19
Seminar on Quantum Computation & Quantum Information part19
 
続・ゲンバのSwift
続・ゲンバのSwift続・ゲンバのSwift
続・ゲンバのSwift
 
Seminar on Quantum Computation & Quantum Information part15
Seminar on Quantum Computation & Quantum Information part15Seminar on Quantum Computation & Quantum Information part15
Seminar on Quantum Computation & Quantum Information part15
 
Seminar on Quantum Computation & Quantum Information part14
Seminar on Quantum Computation & Quantum Information part14Seminar on Quantum Computation & Quantum Information part14
Seminar on Quantum Computation & Quantum Information part14
 
VIPER アーキテクチャによる iOS アプリの設計
VIPER アーキテクチャによる iOS アプリの設計VIPER アーキテクチャによる iOS アプリの設計
VIPER アーキテクチャによる iOS アプリの設計
 
[iOS8] 新たな線形代数ライブラリ Linear Algebra
[iOS8] 新たな線形代数ライブラリ Linear Algebra[iOS8] 新たな線形代数ライブラリ Linear Algebra
[iOS8] 新たな線形代数ライブラリ Linear Algebra
 
Swiftの新機能 Optional
Swiftの新機能 OptionalSwiftの新機能 Optional
Swiftの新機能 Optional
 
ユニットテスト初学者がKiwiFramework非同期テストで失敗した
ユニットテスト初学者がKiwiFramework非同期テストで失敗したユニットテスト初学者がKiwiFramework非同期テストで失敗した
ユニットテスト初学者がKiwiFramework非同期テストで失敗した
 
Applicative functor
Applicative functorApplicative functor
Applicative functor
 

ゲンバのSwift