Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
え!? Swift使ってるのにそんな書きかたしてるのですか!?
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Yusei Nishiyama
November 25, 2014
Technology
9.4k
28
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
え!? Swift使ってるのにそんな書きかたしてるのですか!?
iOSアプリをSwiftらしいコードで記述するために
Yusei Nishiyama
November 25, 2014
More Decks by Yusei Nishiyama
See All by Yusei Nishiyama
Continuous Mobile App Delivery
yuseinishiyama
0
980
Working at Cookpad UK
yuseinishiyama
1
3.8k
Building iOS apps at scale (Mobilization)
yuseinishiyama
4
2k
Working at Scale
yuseinishiyama
3
920
Building iOS apps at scale
yuseinishiyama
2
1.7k
Reduce Build Times and Get Home Eariler
yuseinishiyama
2
900
How to make your app international
yuseinishiyama
3
7.8k
Safer Networking Layer With Swift
yuseinishiyama
0
360
Making Your App Static
yuseinishiyama
13
4.5k
Other Decks in Technology
See All in Technology
少人数データチームのDevin活用実践事例
runandy16
2
440
推論の観測、できていますか? 〜 Google Cloud Gemini Enterprise Agent Platformで 3つの Gemini モデルを実測して踏んだ、評価の罠 〜
shukob
PRO
0
150
20260906 「AWS運用入門」著者が教える、運用業務への生成AI活用入門
masaruogura
0
230
Beyond the Hype: Practical AI for Your Oracle Database with MCP
thatjeffsmith
1
260
enechainの内製セルフサービスプラットフォーム
hiyosi
0
110
書籍『生成AIの安全性入門』の入門
wataoka
0
210
Amazon S3 Tablesに全部任せてみた結果——コンパクション/スナップショット管理は本当に手放せるか
shigeruoda
0
400
Benchmarking Vector Databases: pgvector vs. LanceDB
tsho
0
140
2026-09-04 SRE Tech Talk #15 怠惰なTerraform / Lazy Terraform
masasuzu
0
200
生成AI時代の クレデンシャルとパーミッション設計
nrinetcom
PRO
3
1.5k
GuardDuty 検知対応を DevOps Agent で効率化しようとしている話 / GuardDuty Investigations with DevOps Agent
masahirokawahara
1
310
振り返りこそエンジニアの本領
negima
0
300
Featured
See All Featured
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
870
Docker and Python
trallard
47
4.2k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
370
Evolving SEO for Evolving Search Engines
ryanjones
0
280
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.3k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
320
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
510
ラッコキーワード サービス紹介資料
rakko
1
4.7M
Designing for Performance
lara
611
70k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
840
Faster Mobile Websites
deanohume
310
32k
Side Projects
sachag
455
43k
Transcript
͑!? SwiftͬͯΔͷʹͦΜͳ ॻ͖͔ͨͯ͠ΔͷͰ͔͢!? potatotips#11 @yuseinishiyama
Who am I? • Mobile app engineer at Cookpad Inc.
• Develop apps for iOS • Regulate “Auto Layout” day after day… :’-( • I’m interested in • Metal (new graphics API of Apple) • Functional programming (with Swift) • Reactive programming (Reactive Cocoa)
In Objective-C era… @interface SomeClass : NSObject @property (nonatomic, strong)
NSString *someString; @end ! @implementation SomeClass ! - (void)setSomeString:(NSString *)someString { _someString = someString; [self doSomething]; } ! - (void)doSomething { NSLog(@"I don't feel like doing anything..."); } ! @end ؆୯ʹೖ࣌ʹॲཧΛߦ͏͜ͱ͕Ͱ͖ͨ
With Swift class SomeClass { private var backingStore = ""
var value: String { get { return backingStore } set { backingStore = newValue doSomething() } } func doSomething() { println("I don't feel like doing anything.") } } 85'
Keep calm class SomeClass { var someString: String = ""
{ didSet { doSomething() } } func doSomething() { println("Now I’m sleeping. Please don’t disturb.") } } XJMM4FUEJE4FUΛ͑ಉ͜͡ͱ͕࣮ݱՄೳ
Coalesce fallback class Person { var name: String! } !
var quietPerson = Person() quietPerson.name = "Tom" ! var hisName: String! ! if quietPerson.name != nil { hisName = quietPerson.name } else { hisName = "I can't recognize what he says" }
Use `??` class Person { var name: String! } !
var quietPerson = Person() quietPerson.name = "Tom" ! var hisName = quietPerson.name ?? "I can't recognize what he says"
(Annoying) weakSelf pattern class SomeClass { var ivar: Int? func
methodA(function: ()->()) { function() } func methodB() { weak var weakSelf = self methodA { () -> () in weakSelf!.ivar = 3 } } }
use `[unowned self]` class SomeClass { var ivar: Int? func
methodA(function: ()->()) { function() } func methodB() { methodA { [unowned self] () -> () in self.ivar = 3 } } }
Static variables in function - (BOOL)toggleSwitch { static BOOL aSwitch
= true; aSwitch = !aSwitch; return aSwitch; }
4XJGUߏମͰ͔͠TUBUJDมΛαϙʔ τ͍ͯ͠ͳ͍ʜ
Use struct func toggleSwitch() -> Bool { struct Switch {
static var aSwitch = true } Switch.aSwitch = !Switch.aSwitch return Switch.aSwitch }
Cast var anyObject: AnyObject? = "WE ARE UPPERCASE" if anyObject
is String { let string = anyObject as String println(string.lowercaseString + "?") } ʁ
You can check, cast and bind in one line !
if let string = anyObject as? String { println(string.lowercaseString + "?") }
Trailing closure func methodX(i: Int, function: ()->(String)) { function() }
! methodX(1, { () -> (String) in return "Do nothing" } ) ! methodX(1) { () -> (String) in return "Do nothing" }
Swift array supports map, filter and reduce class Vehicle {
var numberOfTires: Int = 0 } class Car: Vehicle { override init() { super.init() numberOfTires = 4 } } class Bicycle: Vehicle { override init() { super.init() numberOfTires = 2 } } class Unicycle: Vehicle { override init() { super.init() numberOfTires = 1 } } let vehicles = [Car(), Car(), Unicycle(), Bicycle(), Car(), Unicycle()] var numberOfAllTires = vehicles.map{ $0.numberOfTires }.reduce(0, +)
Nested function func setUpViews() { func setupBarButton() { // set
up bar buttons } func setupRefreshControl() { // set up refresh control } setupBarButton() setupRefreshControl() } είʔϓΛอͬͨ··ɺॲཧΛߏԽ͢Δ͜ͱ͕Ͱ͖Δ
Enum with method enum MyTableViewSection: Int { case A =
0, B, C, D func heightForCell() -> CGFloat { switch self { case A: return 30 case B: return 44 case C: return 80 case D: return 44 } } } ! func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return MyTableViewSection(rawValue: indexPath.section)!.heightForCell() } ؔ࿈͢ΔॲཧΛ&OVNଆʹҠৡͨ͠΄͏͕Մಡੑ͕ߴ͍
Any Questions?