SlideShare una empresa de Scribd logo
1 de 83
Descargar para leer sin conexión
objc2swift
∼ Objective-C から Swift への「コード & パラダイム」シフト ∼
@taketo1024
2015/11/11 iOS 9 Bootcamp @ dots.
by Classmethod, inc.
About Me
• ヤフー(株) 所属 iOS アプリ開発者/開発リーダ
• iOS歴 4年 (Xcode 3.x 後半ぐらいから)
• 31歳 1児(♀) の父
「プログラマのための数学勉強会」主催
• 11/21 (土) 第5回開催します!
• 現在参加者募集中!(11/15 (日) まで)
今日のテーマ
Objective-C から Swift への
「コード」と「パラダイム」のシフトについて
背景
• 1年半ほど ObjC で開発していたプロジェクトがあった。当時
iOS 版の開発はほぼ僕一人。
• 4月からリニューアルプロジェクト始動、開発メンバーも4名に
増員。新メンバーに iOS アプリ開発経験者はいなかった。
→ せっかくのリニューアルだし、メンバーの学習も兼ねて Swift
で作り直そう!
→ 旧プロジェクトのソフト資産はできるだけ活用したい。
(Bridging-Header は使いたくない)
ObjC → Swift 移行プロセス
• まずは単純に ObjC → Swift に書き換える。
• そのあと Swift らしい書き方を探りながら改善してく。
単純な書き換え
• 普通の ObjC のコードはほぼ機械的に Swift に置き換えられる。
• こんなものは人間がやるべき作業ではない。正規表現でいけるんじゃ?
ObjC Swift
@interface MyClass class MyClass
@property NSString *text; var text: String
@protocol MyProtocol protocol MyProtocol
@interface MyClass(Hoge) extension MyClass
今年の2月、社内チャットにて
ANTLR...?
ANTLR v4
ANTLR文法ファイル Parser
2秒でわかる ANTLR
コンバータを作ろう!
• ANTLR 用 ObjC の文法は公開されている。
• Swift への変換を力技で実装していく。
• せっかくなので Java ではなく Scala で!
(他の関数型言語も触っておきたかった)
今の所できること
class A : NSObject {
}
Swift
merge .h & .m
@interface MyClass : NSObject
@end
@implementation MyClass
@end
Obj-C
convert method-call
self.somethingWithArg1("hello", arg2:0)
Swift
[self somethingWithArg1:@"hello" arg2:0];
Obj-C
control-flow
for var i = 0; i < 10; i++ {
}
Swift
for (int i = 0; i < 10; i++) {
}
Obj-C
& many more!
• primitive-types
• class-method
• enum
• protocol
• property
• block -> closure
• stringWithFormat
• error reporting
Web UI
利用者の声
満足度
普通
20%
満足
40%
とても満足
40%
とても満足
満足
普通
やや不満
不満
作業効率
上がった
20%
とても上がった
80%
とても上がった
上がった
変わらない
むしろ下がった
勘弁して頂きたかった
N=5N=5
• Swiftへの書き換え方が分からない場合だけでなく、対象のObjective-Cコー
ドが初見の場合などでもSwiftに変換することでグッと読みやすくなり、コー
ドの理解が早まるのが素敵だなと思いました。
• 大量のソースを扱う場合やチーム開発では特に、書き換え方が統一される
ため非常に開発効率が上がると感じました。
• Swift と Objective-C を比べると差異が多くSwift の学習に苦労したので
すが、objc2swift があることで学習コストが下がりました!
• リアルタイムで変換してくれる機能があってその場でもコードを書けるのが
良かった。Scala で動いてると思うとそれだけで楽しくなれた。これがな
かったら手作業で同じことをしていたのかと思うとぞっとする。
利用者の声
DEMO
OpenSourced!
https://github.com/yahoojapan/objc2swift
WebUI も近日公開します!
Goodbye ObjC !!!
• No more too many @s!
• No more YES / NO !
• No more [brackets forMethodCall] !
これからは Swift で
モダンプログラミングや!
(やっとモテる!)
👍
いざやってみると…
• So many ? s...
• So many if let s...
• unexpectedly found nil while blabla...
💧
let result = try? NSJSONSerialization.JSONObjectWithData(…)
let name = ((result?["person"] as? [String: AnyObject])?
["name"] as? String)
if let name = name {
print("My name is: (name)")
}
思てたんと違う…
Swift とは…
• Swift は ObjC の「癖」を無くしただけの言語じゃない。
(Objective-C without the C ...? wtf)
• Swift に導入された新しいパラダイムをちゃんと理解しな
いと上手く書けない。
• さらに ObjC / Foundation への理解もないと、「なぜこ
うなっているのか」が分からないところがある。
• Swift には Swift の「癖」がある!
0. Swift 誕生の背景
1. Optional 型との付き合い方
2. 関数が First-Class であるということ
3. Protocol Oriented とは何なのか
これから話すこと
0. Swift 誕生の背景
Objective-C の歴史
• 1983年に開発され、1985年に Apple社を去った Steve Jobs が
NeXT Computer 社を創立、その主力言語として採用される。
• 1997年、Apple社 が NeXT社 を買収し、2001年の Mac OS X
の Cocoaフレームワーク のコア言語として採用される。
• Foundation クラスの NS は OS名 NeXTSTEP 由来!
• ObjC は C言語に Smalltalk 風のオブジェクト指向システムを追加したもの。
• クラスもオブジェクトもただの構造体へのポインタ。
• メソッドコールも C の関数呼び出しに変換される。つまり実態は C 。
• ObjC が @ だらけなのは C に対するプリプロセスだったから。
typedef	 struct	 objc_class	 *Class;
struct	 objc_class	 {	 

    struct	 objc_class	 *isa;	 

    struct	 objc_class	 *super_class;	 

    const	 char	 *name;	 

    …⋯

};

typedef	 struct	 objc_object	 {

    class	 isa;

}	 *id;
2005年の連載:

「ダイナミックObjective-C - クラスとは何か」
Obj-C の弱点
• ランタイム時処理によるオーバーヘッド
• コンパイル時の最適化ができない
• 弱い型付けによる安全性の犠牲
• 言語仕様の時代遅れ感の強まり
Objective-C の進化と Swift の誕生
GCC
Objective-C
1983
GCC
Objective-C 2.0
2007
LLVM
Modern

Objective-C
2012
Swift 1.0
2014
参考:Swiftから透けて⾒見見えるAppleのコンパイラ技術
LLVM
Clang swiftc
コンパイラも Apple が独自に開発!
LLVM 作った人が 

Swift も作った!
新言語 Swift への要請
(勝手な想像ですが)
• Objective-C との相互互換性がある。
• 安全かつコンパイル時最適化が可能。
• 言語はできるだけ簡易に保ったまま関数型の
特性も取り入れたい。
The Swift language … also greatly
benefited from the experiences hard-won
by many other languages in the field,
drawing ideas from Objective-C, Rust,
Haskell, Ruby, Python, C#, CLU, and far
too many others to list.
http://nondot.org/sabre/
Chris Lattner
ObjC にはなかった新たなパラダイム
• Strongly Typed (w/ Optional Type)
• Functional
• Protocol-Oriented
1. Optional 型との付き合い方
Apple のドキュメントより
if let johnsStreet = john.residence?.address?.street {
print("John's street name is (johnsStreet).")
} else {
print("Unable to retrieve the address.")
}
Swift also introduces optional types, which handle the absence of a value.
Optionals say either “there is a value, and it equals x” or “there isn’t a value
at all”. Using optionals is similar to using nil with pointers in Objective-C,
but they work for any type, not just classes.
なるほど、 nil を入れたきゃ
型に ? をつけときゃいいのね
なるほど、 nil を入れたきゃ
型に ? をつけときゃいいのね
❌この理解のまま実際にコードを書いてしまうと
永久に型不一致のエラーに悩まされることになる。
public enum Optional<Wrapped> : NilLiteralConvertible {
case None
case Some(Wrapped)
}
• Optional は任意の型を持てるジェネリックな enumで、 Int?
は Optional<Int> と等価。
• 任意の値は Optional 型への代入によって Optional 型に暗黙
キャストされる。
• nil はただのリテラルで、実態は Optional 型の値 None 。
→ イメージが掴めるまで難しい。
Swift Standard Library
Optional 型は
「値が入ってるかもしれないし空かもしれない箱」に例えられる
Functors, Applicatives, And Monads In Pictures
もっとわかりやすく、
Optional は長さが 0 または 1 の Array と思おう!
let maybeInt : Optional<Int> = .Some(1)
let actualInt = maybeInt!
let maybeInt : Optional<Int> = 1
let actualInt = maybeInt!
let maybeInt : Optional<Int> = .Some(1)
let actualInt = maybeInt!
let actualInt = maybeInt!
let maybeInt : Array<Int> = [1]
let actualInt = maybeInt[0]
こうだと思う
let maybeInt : Optional<Int> = nil
let actualInt = maybeInt!

// fatal error: unexpectedly found nil
while unwrapping an Optional value
let maybeInt : Array<Int> = []
let actualInt = maybeInt[0]
// fatal error: Array index out of range
nil は空配列みたいなモンなんだから、
中身を取り出そうとしたら怒られるに決まってる。
let maybeInt : Optional<Int> = .Some(1)
if let actualInt = maybeInt {
print("int: (actualInt)")
}
let maybeInt : Array<Int> = [1]
for actualInt in maybeInt {
print("int: (actualInt)")
}
if let は 1要素に対する for in と同じ!
(空なら for は回らないよネ)
Swift は Optional に対して限定的に暗黙キャストを認めている。
(他は変数に代入されたものは明示キャストする必要がある)
無駄なコードを書かずに暗黙的に Optional 型を使えるのは便利だが、
Objective-C の感覚で nil を捉えているとずっと辛い思いをすることになる。
Optional は要素を最大一個だけ入れられる箱!
とても不思議な guard let
let maybeInt: Optional = 1
guard let actualInt = maybeInt else {
fatalError()
}
print("value: (actualInt)")
とても不思議な guard let
let value: Optional = 1
guard let value = value else {
fatalError()
}
print("value: (value)")
unwrap した値を同じ変数に代入できる…
とても不思議な guard let
let value: Optional = 1
guard let value = value else {
fatalError()
}
print("value: (value)")
同じスコープ内で変数の型が変わってる…!!!
Optional<Int> 型
Int 型
guard let はその前後で世界が変わる。
2. 関数が First-Class であるということ
関数を変数に代入したり、引数にとったり、
戻り値として返せるということ。
let a = [2, 3, 1, 4]
a.sort(<) // [1, 2, 3, 4]
a.sort(>) // [4, 3, 2, 1]
let a = [2, 3, 1, 4]
a.sort(<) // [1, 2, 3, 4]
a.sort(>) // [4, 3, 2, 1]
これができるのは:
• 演算子も関数であり
• sort は (T, T) -> Bool 型の関数を引数にとるから
let a = [2, 3, 1, 4]
let lt: (Int, Int) -> Bool = (<)
lt(1, 2) // true. (1 < 2) と等価
a.sort(lt) // [1, 2, 3, 4]
こう書くと関数が変数に代入されてる様子が分かる。
ObjC では関数、メソッド、ブロック、
演算子は全て別のものであったが、
Swift では関数に統一されている。
let a = [2, 3, 1, 4] // [2, 3, 1, 4]
let b = a.map {$0 * 2} // [4, 6, 2, 8]
let c = b.filter {$0 < 5} // [4, 2]
map や filter を使いこなそう!
override func layoutAttributesForElementsInRect(rect: CGRect) ->
[UICollectionViewLayoutAttributes]? {
var result = [UICollectionViewLayoutAttributes]()
for i in 0 ..< items.count {
let indexPath = NSIndexPath(forItem: i, inSection: 0)
let attr = layoutAttributesForItemAtIndexPath(indexPath)
if attr.alpha == 0 {
continue
}
if !CGRectIntersectsRect(attr.frame, rect) {
continue
}
result.append(attr)
}
return result
}
map や filter を使うとループ処理が簡潔に書ける
before
override func layoutAttributesForElementsInRect(rect: CGRect) ->
[UICollectionViewLayoutAttributes]? {
let indexPaths = (0 ..< items.count).map {
NSIndexPath(forItem: $0, inSection: 0)
}
let attrs = indexPaths.map( layoutAttributesForItemAtIndexPath )
let attrsInScreen = attrs.filter { $0.alpha > 0 }
.filter{ CGRectIntersectsRect($0.frame,
rect)}
return attrsInScreen
}
map や filter を使うとループ処理が簡潔に書ける
after
override func layoutAttributesForElementsInRect(rect: CGRect) ->
[UICollectionViewLayoutAttributes]? {
return (0 ..< items.count)
.map { NSIndexPath(forItem: $0, inSection: 0) }
.map ( layoutAttributesForItemAtIndexPath )
.filter { $0.alpha != 0 }
.filter { CGRectIntersectsRect($0.frame, rect)}
}
慣れてきたらこう
let a : Optional = 1 // .Some(1)
let b = a.map { $0 * 2 } // .Some(2)
もちろん Optional に対しても map は使える
.Some(1) は [1] みたいなモンなんだから当たり前
let a : Optional = "1" // .Some("1")
let b = a.map { Int($0) } // .Some( .Some(1) )
let s : Optional = "hehe" // .Some("hehe")
let t = s.map { Int($0) } // .Some( .None )
map する関数が Optional を返す場合は
2重に包まれてしまう…
String -> Int は失敗する場合があるので Optional
let a : Optional = "1" // .Some("1")
let b = a.flatMap { Int($0) } // .Some(1)
let s : Optional = "hehe" // .Some("hehe")
let t = s.flatMap { Int($0) } // .nil
そういうときは flatMap !
let a = ["1", "2", "heh", "4", "lol"]
let b = a.flatMap{ Int($0) } // [1, 2, 4]
配列に Optional な戻り値を返す関数を
flatMap して filter みたいなこともできる
• ObjC 出身者が普通に Swift コードを書いてても関数型な書
き方はあまり鍛えられない。
• チームに Scala や Haskell などの経験者がいると頼もしい!
いない場合はこれらの言語で鍛錬しましょう(僕も鍛錬中)
• もっと設計レベルで関数型を取り入れたい場合は Promise(通
信)や Reactive(UI)も検討してみましょう。
3. Protocol-Oriented とは何なのか
WWDC2015 - Protocol-Oriented Programming in Swift
Swift is the first protocol oriented language.
(ドヤァ)
ん…?
ただのデフォルト実装付きの
インターフェースじゃないの?
僕なりにその「偉大さ」を考えてみた。
Swift の protocol とは…
• Java の interface のように型として扱えて、
• Scala の trait のように mix-in ができ、
• Haskell の type class のような AdHoc ポリ
モーフィズムが実現できる素晴らしい仕組み!
Haskell の「型クラス」
class Eq a where
(==), (/=) :: a -> a -> Bool
x == y = not (x /= y)
x /= y = not (x == y)
data Point = Pt Double Double
instance Eq Point where
(Pt x y) == (Pt x' y') = x == x' && y == y'
Eq クラス
Point 型を Eq クラスのインスタンスに
http://walk.wgag.net/haskell/typeclass.html より
そっくり!
public protocol Equatable {
public func ==(lhs: Self, rhs: Self) -> Bool
}
struct Point: Equatable {
let x, y: Double
}
func ==(p1: Point, p2: Point) -> Bool {
return p1.x == p2.x && p1.y == p2.y
}
Equatable プロトコル
Point 型を Equatable に適合
Scala / Haskell 大好き Uくん に「Protocol は 型クラスみたいなモンと思う」と言って、
「なるほど、わかった!」と言って作ってくれた例。
protocol AddMonoid {
static var zero: Self { get }
static func plus(lhs: Self, _ rhs: Self) -> Self
}
extension Int: AddMonoid {
static var zero: Int { return 0 }
static func plus(lhs: Int, _ rhs: Int) -> Int { return lhs + rhs }
}
extension String: AddMonoid {
static var zero: String { return "" }
static func plus(lhs: String, _ rhs: String) -> String { return lhs + rhs }
}
extension SequenceType where Generator.Element: AddMonoid {
func sum() -> Generator.Element {
return reduce(Generator.Element.zero) { Generator.Element.plus($0, $1) }
}
}
[1, 2, 3].sum() // 6
["abc", "def", "ghi"].sum() // "abcdefghi"
class-oriented vs protocol-oriented
(僕のイメージ)
struct
継承によってデータと
機能が増えていく
具体型が必要最小のデータを持ち、
Protocol によって機能を足していく
protocolA
protocolB
純粋に protocol-oriented なプログラミングは可能か?
• 現段階では厳しい。
• Swift 標準ライブラリは protocol-oriented に作られている
が、 Foundation / UIKit はもちろんなっていない。
• 型パラメータの変位がサポートされていないので複合型を作ろ
うとすると辛い。特に Self Requirement がやばい(次ページ)。
protocol MyProtocol: Equatable {}
struct A: MyProtocol {}
struct B: MyProtocol {}
let a: [MyProtocol] = [A(), B()]


// protocol 'MyProtocol' can only be used
as a generic constraint because it has
Self or associated type requirements
僕なりの結論:
今は extension を便利に使うぐらいにしといて、そんな
にどっぷり protocol-oriented に浸かることもない。
Swift や Foundation / UIKit の進化を待とう。
まとめ(口頭)
Thanks!
Twitter: taketo1024
Blog: http://taketo1024.hateblo.jp/

Más contenido relacionado

La actualidad más candente

Riverpodでテストを書こう
Riverpodでテストを書こうRiverpodでテストを書こう
Riverpodでテストを書こうShinnosuke Tokuda
 
動的なILの生成と編集
動的なILの生成と編集動的なILの生成と編集
動的なILの生成と編集terurou
 
Swift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウムSwift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウムYuichi Yoshida
 
async/await不要論
async/await不要論async/await不要論
async/await不要論bleis tift
 
本番環境で使える実行コード記録機能
本番環境で使える実行コード記録機能本番環境で使える実行コード記録機能
本番環境で使える実行コード記録機能mametter
 
Ruby For Work
Ruby For WorkRuby For Work
Ruby For Workbash0C7
 
hooks riverpod + state notifier + freezed でのドメイン駆動設計
hooks riverpod + state notifier + freezed でのドメイン駆動設計hooks riverpod + state notifier + freezed でのドメイン駆動設計
hooks riverpod + state notifier + freezed でのドメイン駆動設計Shinnosuke Tokuda
 
Tizen 2.0 alpha でサポートされなかった native api
Tizen 2.0 alpha でサポートされなかった native apiTizen 2.0 alpha でサポートされなかった native api
Tizen 2.0 alpha でサポートされなかった native apiNaruto TAKAHASHI
 
RcppEigen and SVD
RcppEigen and SVDRcppEigen and SVD
RcppEigen and SVDXiangze
 
Rubinius Under a Microscope
Rubinius Under a MicroscopeRubinius Under a Microscope
Rubinius Under a Microscope高広 内山
 
The Next Generation for C# Developers
The Next Generation for C# DevelopersThe Next Generation for C# Developers
The Next Generation for C# DevelopersTakayoshi Tanaka
 
jazug34 Container Apps Key Vault
jazug34 Container Apps Key Vaultjazug34 Container Apps Key Vault
jazug34 Container Apps Key VaultTakekazu Omi
 
Perl::Lint is over, for the present
Perl::Lint is over, for the presentPerl::Lint is over, for the present
Perl::Lint is over, for the presentmoznion
 
Coq for Moblie Phone @ ML名古屋
Coq for Moblie Phone @ ML名古屋Coq for Moblie Phone @ ML名古屋
Coq for Moblie Phone @ ML名古屋Hiroki Mizuno
 

La actualidad más candente (20)

Rx入門
Rx入門Rx入門
Rx入門
 
Riverpodでテストを書こう
Riverpodでテストを書こうRiverpodでテストを書こう
Riverpodでテストを書こう
 
動的なILの生成と編集
動的なILの生成と編集動的なILの生成と編集
動的なILの生成と編集
 
Swift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウムSwift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウム
 
PerlMotion
PerlMotionPerlMotion
PerlMotion
 
Clrh 20140906 lt
Clrh 20140906 ltClrh 20140906 lt
Clrh 20140906 lt
 
async/await不要論
async/await不要論async/await不要論
async/await不要論
 
本番環境で使える実行コード記録機能
本番環境で使える実行コード記録機能本番環境で使える実行コード記録機能
本番環境で使える実行コード記録機能
 
Ruby For Work
Ruby For WorkRuby For Work
Ruby For Work
 
hooks riverpod + state notifier + freezed でのドメイン駆動設計
hooks riverpod + state notifier + freezed でのドメイン駆動設計hooks riverpod + state notifier + freezed でのドメイン駆動設計
hooks riverpod + state notifier + freezed でのドメイン駆動設計
 
Rx Showcase
Rx ShowcaseRx Showcase
Rx Showcase
 
ReactiveSignalR
ReactiveSignalRReactiveSignalR
ReactiveSignalR
 
Tizen 2.0 alpha でサポートされなかった native api
Tizen 2.0 alpha でサポートされなかった native apiTizen 2.0 alpha でサポートされなかった native api
Tizen 2.0 alpha でサポートされなかった native api
 
RcppEigen and SVD
RcppEigen and SVDRcppEigen and SVD
RcppEigen and SVD
 
Rubinius Under a Microscope
Rubinius Under a MicroscopeRubinius Under a Microscope
Rubinius Under a Microscope
 
The Next Generation for C# Developers
The Next Generation for C# DevelopersThe Next Generation for C# Developers
The Next Generation for C# Developers
 
jazug34 Container Apps Key Vault
jazug34 Container Apps Key Vaultjazug34 Container Apps Key Vault
jazug34 Container Apps Key Vault
 
Perl::Lint is over, for the present
Perl::Lint is over, for the presentPerl::Lint is over, for the present
Perl::Lint is over, for the present
 
Coq for Moblie Phone @ ML名古屋
Coq for Moblie Phone @ ML名古屋Coq for Moblie Phone @ ML名古屋
Coq for Moblie Phone @ ML名古屋
 
bicep 0.5 pre
bicep 0.5 prebicep 0.5 pre
bicep 0.5 pre
 

Destacado

「数える」とは何か? 〜 「とは何か?」を問う、AI時代の数学
「数える」とは何か? 〜 「とは何か?」を問う、AI時代の数学「数える」とは何か? 〜 「とは何か?」を問う、AI時代の数学
「数える」とは何か? 〜 「とは何か?」を問う、AI時代の数学Taketo Sano
 
何もないところから数を作る
何もないところから数を作る何もないところから数を作る
何もないところから数を作るTaketo Sano
 
何もないところから数を作る
何もないところから数を作る何もないところから数を作る
何もないところから数を作るTaketo Sano
 
プログラマのための線形代数再入門
プログラマのための線形代数再入門プログラマのための線形代数再入門
プログラマのための線形代数再入門Taketo Sano
 
Swift2.x を Scala からみる
Swift2.x を Scala からみるSwift2.x を Scala からみる
Swift2.x を Scala からみるYuichi Adachi
 
プログラマのための線形代数再入門2 〜 要件定義から学ぶ行列式と逆行列
プログラマのための線形代数再入門2 〜 要件定義から学ぶ行列式と逆行列プログラマのための線形代数再入門2 〜 要件定義から学ぶ行列式と逆行列
プログラマのための線形代数再入門2 〜 要件定義から学ぶ行列式と逆行列Taketo Sano
 
コードを書けば複素数がわかる
コードを書けば複素数がわかるコードを書けば複素数がわかる
コードを書けば複素数がわかるTaketo Sano
 
基底変換、固有値・固有ベクトル、そしてその先
基底変換、固有値・固有ベクトル、そしてその先基底変換、固有値・固有ベクトル、そしてその先
基底変換、固有値・固有ベクトル、そしてその先Taketo Sano
 
さらに上を目指すための iOS アプリ設計
さらに上を目指すための iOS アプリ設計さらに上を目指すための iOS アプリ設計
さらに上を目指すための iOS アプリ設計Taketo Sano
 
基礎からのベイズ統計学 輪読会資料 第1章 確率に関するベイズの定理
基礎からのベイズ統計学 輪読会資料 第1章 確率に関するベイズの定理基礎からのベイズ統計学 輪読会資料 第1章 確率に関するベイズの定理
基礎からのベイズ統計学 輪読会資料 第1章 確率に関するベイズの定理Ken'ichi Matsui
 
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料 「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料 Ken'ichi Matsui
 
統計学の基礎の基礎
統計学の基礎の基礎統計学の基礎の基礎
統計学の基礎の基礎Ken'ichi Matsui
 
情報幾何学 #2.4
情報幾何学 #2.4情報幾何学 #2.4
情報幾何学 #2.4Taketo Sano
 
情報幾何学 #2 #infogeo16
情報幾何学 #2 #infogeo16情報幾何学 #2 #infogeo16
情報幾何学 #2 #infogeo16Taketo Sano
 
二次形式と素数で遊ぼう - 第2回 #日曜数学会
二次形式と素数で遊ぼう - 第2回 #日曜数学会 二次形式と素数で遊ぼう - 第2回 #日曜数学会
二次形式と素数で遊ぼう - 第2回 #日曜数学会 Junpei Tsuji
 
iOS 9 Overview - iOS 9 Bootcamp in Tokyo - 20150930
iOS 9 Overview - iOS 9 Bootcamp in Tokyo - 20150930iOS 9 Overview - iOS 9 Bootcamp in Tokyo - 20150930
iOS 9 Overview - iOS 9 Bootcamp in Tokyo - 20150930Ichiro Yamamoto
 
奥行きを意識したプロダクト-iOS9で変わる体験-
奥行きを意識したプロダクト-iOS9で変わる体験-奥行きを意識したプロダクト-iOS9で変わる体験-
奥行きを意識したプロダクト-iOS9で変わる体験-正典 三橋
 
Xcode 7 の新しいところ #cm_ios9
Xcode 7 の新しいところ #cm_ios9Xcode 7 の新しいところ #cm_ios9
Xcode 7 の新しいところ #cm_ios9Tomohiro Kumagai
 

Destacado (20)

「数える」とは何か? 〜 「とは何か?」を問う、AI時代の数学
「数える」とは何か? 〜 「とは何か?」を問う、AI時代の数学「数える」とは何か? 〜 「とは何か?」を問う、AI時代の数学
「数える」とは何か? 〜 「とは何か?」を問う、AI時代の数学
 
何もないところから数を作る
何もないところから数を作る何もないところから数を作る
何もないところから数を作る
 
何もないところから数を作る
何もないところから数を作る何もないところから数を作る
何もないところから数を作る
 
プログラマのための線形代数再入門
プログラマのための線形代数再入門プログラマのための線形代数再入門
プログラマのための線形代数再入門
 
Swift2.x を Scala からみる
Swift2.x を Scala からみるSwift2.x を Scala からみる
Swift2.x を Scala からみる
 
プログラマのための線形代数再入門2 〜 要件定義から学ぶ行列式と逆行列
プログラマのための線形代数再入門2 〜 要件定義から学ぶ行列式と逆行列プログラマのための線形代数再入門2 〜 要件定義から学ぶ行列式と逆行列
プログラマのための線形代数再入門2 〜 要件定義から学ぶ行列式と逆行列
 
コードを書けば複素数がわかる
コードを書けば複素数がわかるコードを書けば複素数がわかる
コードを書けば複素数がわかる
 
基底変換、固有値・固有ベクトル、そしてその先
基底変換、固有値・固有ベクトル、そしてその先基底変換、固有値・固有ベクトル、そしてその先
基底変換、固有値・固有ベクトル、そしてその先
 
さらに上を目指すための iOS アプリ設計
さらに上を目指すための iOS アプリ設計さらに上を目指すための iOS アプリ設計
さらに上を目指すための iOS アプリ設計
 
基礎からのベイズ統計学 輪読会資料 第1章 確率に関するベイズの定理
基礎からのベイズ統計学 輪読会資料 第1章 確率に関するベイズの定理基礎からのベイズ統計学 輪読会資料 第1章 確率に関するベイズの定理
基礎からのベイズ統計学 輪読会資料 第1章 確率に関するベイズの定理
 
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料 「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料
 
統計学の基礎の基礎
統計学の基礎の基礎統計学の基礎の基礎
統計学の基礎の基礎
 
情報幾何学 #2.4
情報幾何学 #2.4情報幾何学 #2.4
情報幾何学 #2.4
 
情報幾何学 #2 #infogeo16
情報幾何学 #2 #infogeo16情報幾何学 #2 #infogeo16
情報幾何学 #2 #infogeo16
 
二次形式と素数で遊ぼう - 第2回 #日曜数学会
二次形式と素数で遊ぼう - 第2回 #日曜数学会 二次形式と素数で遊ぼう - 第2回 #日曜数学会
二次形式と素数で遊ぼう - 第2回 #日曜数学会
 
shinobu.apk #1
shinobu.apk #1shinobu.apk #1
shinobu.apk #1
 
iOS 9 Overview - iOS 9 Bootcamp in Tokyo - 20150930
iOS 9 Overview - iOS 9 Bootcamp in Tokyo - 20150930iOS 9 Overview - iOS 9 Bootcamp in Tokyo - 20150930
iOS 9 Overview - iOS 9 Bootcamp in Tokyo - 20150930
 
奥行きを意識したプロダクト-iOS9で変わる体験-
奥行きを意識したプロダクト-iOS9で変わる体験-奥行きを意識したプロダクト-iOS9で変わる体験-
奥行きを意識したプロダクト-iOS9で変わる体験-
 
Xcode 7 の新しいところ #cm_ios9
Xcode 7 の新しいところ #cm_ios9Xcode 7 の新しいところ #cm_ios9
Xcode 7 の新しいところ #cm_ios9
 
Javaone報告会
Javaone報告会Javaone報告会
Javaone報告会
 

Similar a objc2swift 〜 Objective-C から Swift への「コード&パラダイム」シフト

Swift事情2014夏 ~ Swift入門 beta6対応
Swift事情2014夏 ~ Swift入門 beta6対応Swift事情2014夏 ~ Swift入門 beta6対応
Swift事情2014夏 ~ Swift入門 beta6対応Tomoki Hasegawa
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Rubymitim
 
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Ransui Iso
 
SwiftのOptionalを理解する
SwiftのOptionalを理解するSwiftのOptionalを理解する
SwiftのOptionalを理解する幸雄 村上
 
Swiftによる関数型プログラミング超入門
Swiftによる関数型プログラミング超入門Swiftによる関数型プログラミング超入門
Swiftによる関数型プログラミング超入門Hisakuni Fujimoto
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Ransui Iso
 
Goで言語処理系(の途中まで)を作ろう
Goで言語処理系(の途中まで)を作ろうGoで言語処理系(の途中まで)を作ろう
Goで言語処理系(の途中まで)を作ろうEsehara Shigeo
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Ra Zon
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Ransui Iso
 
夏だからJava再入門
夏だからJava再入門夏だからJava再入門
夏だからJava再入門Katsumi Honda
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜Hiromi Ishii
 
React+TypeScriptと格闘して得た知見
React+TypeScriptと格闘して得た知見React+TypeScriptと格闘して得た知見
React+TypeScriptと格闘して得た知見iPride Co., Ltd.
 
F#によるFunctional Programming入門
F#によるFunctional Programming入門F#によるFunctional Programming入門
F#によるFunctional Programming入門bleis tift
 
2歩目 プレゼン資料 初歩から始めるjava勉強会
2歩目 プレゼン資料 初歩から始めるjava勉強会2歩目 プレゼン資料 初歩から始めるjava勉強会
2歩目 プレゼン資料 初歩から始めるjava勉強会悠平 鎌田
 
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftSwift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftTomohiro Kumagai
 

Similar a objc2swift 〜 Objective-C から Swift への「コード&パラダイム」シフト (20)

Swift事情2014夏 ~ Swift入門 beta6対応
Swift事情2014夏 ~ Swift入門 beta6対応Swift事情2014夏 ~ Swift入門 beta6対応
Swift事情2014夏 ~ Swift入門 beta6対応
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Ruby
 
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1
 
SwiftのOptionalを理解する
SwiftのOptionalを理解するSwiftのOptionalを理解する
SwiftのOptionalを理解する
 
Swiftによる関数型プログラミング超入門
Swiftによる関数型プログラミング超入門Swiftによる関数型プログラミング超入門
Swiftによる関数型プログラミング超入門
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
 
Goで言語処理系(の途中まで)を作ろう
Goで言語処理系(の途中まで)を作ろうGoで言語処理系(の途中まで)を作ろう
Goで言語処理系(の途中まで)を作ろう
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
 
夏だからJava再入門
夏だからJava再入門夏だからJava再入門
夏だからJava再入門
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
 
ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
C#勉強会
C#勉強会C#勉強会
C#勉強会
 
React+TypeScriptと格闘して得た知見
React+TypeScriptと格闘して得た知見React+TypeScriptと格闘して得た知見
React+TypeScriptと格闘して得た知見
 
F#によるFunctional Programming入門
F#によるFunctional Programming入門F#によるFunctional Programming入門
F#によるFunctional Programming入門
 
こわくないScala
こわくないScalaこわくないScala
こわくないScala
 
2歩目 プレゼン資料 初歩から始めるjava勉強会
2歩目 プレゼン資料 初歩から始めるjava勉強会2歩目 プレゼン資料 初歩から始めるjava勉強会
2歩目 プレゼン資料 初歩から始めるjava勉強会
 
Lombok ハンズオン
Lombok ハンズオンLombok ハンズオン
Lombok ハンズオン
 
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftSwift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswift
 
Scala is-unscared
Scala is-unscaredScala is-unscared
Scala is-unscared
 

Más de Taketo Sano

Divisibility of Lee’s class and its relation with Rasmussen’s invariant / 201...
Divisibility of Lee’s class and its relation with Rasmussen’s invariant / 201...Divisibility of Lee’s class and its relation with Rasmussen’s invariant / 201...
Divisibility of Lee’s class and its relation with Rasmussen’s invariant / 201...Taketo Sano
 
トポロジーと圏論の夜明け
トポロジーと圏論の夜明けトポロジーと圏論の夜明け
トポロジーと圏論の夜明けTaketo Sano
 
Swift で数学研究のススメ
Swift で数学研究のススメSwift で数学研究のススメ
Swift で数学研究のススメTaketo Sano
 
(意欲的な中高生のための)トポロジー・圏論・コンピュータ
(意欲的な中高生のための)トポロジー・圏論・コンピュータ(意欲的な中高生のための)トポロジー・圏論・コンピュータ
(意欲的な中高生のための)トポロジー・圏論・コンピュータTaketo Sano
 
特性類の気持ち
特性類の気持ち特性類の気持ち
特性類の気持ちTaketo Sano
 
Swift で数学のススメ 〜 プログラミングと数学は同時に学べ
Swift で数学のススメ 〜 プログラミングと数学は同時に学べSwift で数学のススメ 〜 プログラミングと数学は同時に学べ
Swift で数学のススメ 〜 プログラミングと数学は同時に学べTaketo Sano
 
山手線は丸いのか?プログラマのためのトポロジー入門
山手線は丸いのか?プログラマのためのトポロジー入門山手線は丸いのか?プログラマのためのトポロジー入門
山手線は丸いのか?プログラマのためのトポロジー入門Taketo Sano
 
2015 02-18 xxx-literalconvertible
2015 02-18 xxx-literalconvertible2015 02-18 xxx-literalconvertible
2015 02-18 xxx-literalconvertibleTaketo Sano
 
let UIWebView as WKWebView
let UIWebView as WKWebViewlet UIWebView as WKWebView
let UIWebView as WKWebViewTaketo Sano
 
虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数Taketo Sano
 
ひろ子 in Objective-C
ひろ子 in Objective-Cひろ子 in Objective-C
ひろ子 in Objective-CTaketo Sano
 
Objective-C が好きになる Tips & Hack
Objective-C が好きになる Tips & HackObjective-C が好きになる Tips & Hack
Objective-C が好きになる Tips & HackTaketo Sano
 
Konashi で始める iOS 電子工作
Konashi で始める iOS 電子工作Konashi で始める iOS 電子工作
Konashi で始める iOS 電子工作Taketo Sano
 
下位互換コード隠蔽のストイシズム
下位互換コード隠蔽のストイシズム下位互換コード隠蔽のストイシズム
下位互換コード隠蔽のストイシズムTaketo Sano
 

Más de Taketo Sano (14)

Divisibility of Lee’s class and its relation with Rasmussen’s invariant / 201...
Divisibility of Lee’s class and its relation with Rasmussen’s invariant / 201...Divisibility of Lee’s class and its relation with Rasmussen’s invariant / 201...
Divisibility of Lee’s class and its relation with Rasmussen’s invariant / 201...
 
トポロジーと圏論の夜明け
トポロジーと圏論の夜明けトポロジーと圏論の夜明け
トポロジーと圏論の夜明け
 
Swift で数学研究のススメ
Swift で数学研究のススメSwift で数学研究のススメ
Swift で数学研究のススメ
 
(意欲的な中高生のための)トポロジー・圏論・コンピュータ
(意欲的な中高生のための)トポロジー・圏論・コンピュータ(意欲的な中高生のための)トポロジー・圏論・コンピュータ
(意欲的な中高生のための)トポロジー・圏論・コンピュータ
 
特性類の気持ち
特性類の気持ち特性類の気持ち
特性類の気持ち
 
Swift で数学のススメ 〜 プログラミングと数学は同時に学べ
Swift で数学のススメ 〜 プログラミングと数学は同時に学べSwift で数学のススメ 〜 プログラミングと数学は同時に学べ
Swift で数学のススメ 〜 プログラミングと数学は同時に学べ
 
山手線は丸いのか?プログラマのためのトポロジー入門
山手線は丸いのか?プログラマのためのトポロジー入門山手線は丸いのか?プログラマのためのトポロジー入門
山手線は丸いのか?プログラマのためのトポロジー入門
 
2015 02-18 xxx-literalconvertible
2015 02-18 xxx-literalconvertible2015 02-18 xxx-literalconvertible
2015 02-18 xxx-literalconvertible
 
let UIWebView as WKWebView
let UIWebView as WKWebViewlet UIWebView as WKWebView
let UIWebView as WKWebView
 
虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数
 
ひろ子 in Objective-C
ひろ子 in Objective-Cひろ子 in Objective-C
ひろ子 in Objective-C
 
Objective-C が好きになる Tips & Hack
Objective-C が好きになる Tips & HackObjective-C が好きになる Tips & Hack
Objective-C が好きになる Tips & Hack
 
Konashi で始める iOS 電子工作
Konashi で始める iOS 電子工作Konashi で始める iOS 電子工作
Konashi で始める iOS 電子工作
 
下位互換コード隠蔽のストイシズム
下位互換コード隠蔽のストイシズム下位互換コード隠蔽のストイシズム
下位互換コード隠蔽のストイシズム
 

Último

【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 

Último (10)

【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 

objc2swift 〜 Objective-C から Swift への「コード&パラダイム」シフト