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
SwiftLint実践入門
Search
akatsuki174
October 02, 2017
Programming
7
930
SwiftLint実践入門
2017/10/02 俺コン Day. 1
※2017/10/03 17時頃に資料を上げ直しています。
akatsuki174
October 02, 2017
Tweet
Share
More Decks by akatsuki174
See All by akatsuki174
私が変えてきたこと、変えなかったこと
akatsuki174
2
770
最近読んでいる本-読書シェア会vol.1
akatsuki174
2
190
SwiftUI、UIKitでキャプチャを撮ろう!
akatsuki174
1
91
Appleにおけるプライバシーの全容を把握する
akatsuki174
0
5.7k
近年のAppleにおける位置情報とプライバシー
akatsuki174
3
450
オフライン勉強会ぼっち対策
akatsuki174
1
650
Xcode 15の新機能
akatsuki174
0
2.8k
AndroidにもSelect Photosがやってきた
akatsuki174
0
1.4k
Famm Android改善記
akatsuki174
0
390
Other Decks in Programming
See All in Programming
階層化自動テストで開発に機動力を
ickx
1
440
11年かかって やっとVibe Codingに 時代が追いつきましたね
yimajo
0
210
それ CLI フレームワークがなくてもできるよ / Building CLI Tools Without Frameworks
orgachem
PRO
11
2.9k
Streamlitで実現できるようになったこと、実現してくれたこと
ayumu_yamaguchi
2
240
AIコーディングエージェント全社導入とセキュリティ対策
hikaruegashira
15
8.4k
Jakarta EE Meets AI
ivargrimstad
0
390
脱Riverpod?fqueryで考える、TanStack Queryライクなアーキテクチャの可能性
ostk0069
0
570
MySQL9でベクトルカラム登場!PHP×AWSでのAI/類似検索はこう変わる
suguruooki
1
250
What's new in Adaptive Android development
fornewid
0
120
Startups on Rails in Past, Present and Future–Irina Nazarova, RailsConf 2025
irinanazarova
0
310
CDK引数設計道場100本ノック
badmintoncryer
2
590
The Modern View Layer Rails Deserves: A Vision For 2025 And Beyond @ RailsConf 2025, Philadelphia, PA
marcoroth
2
830
Featured
See All Featured
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
283
13k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.4k
Mobile First: as difficult as doing things right
swwweet
223
9.7k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
181
54k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Measuring & Analyzing Core Web Vitals
bluesmoon
7
530
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.8k
Intergalactic Javascript Robots from Outer Space
tanoku
271
27k
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.6k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
126
53k
Automating Front-end Workflow
addyosmani
1370
200k
Transcript
SwiftLint࣮ફೖ @akatsuki174
ࣗݾհ • ਢ౻ຘ • iOSΤϯδχΞ • גࣜձࣾZaimॴଐ • Twitter, Qiita,
SlideShare, Github, SpeakerDeck →akatsuki174
None
એ 10/13(ۚ)ɺ10/20(ۚ)ͷ2days 19:20ʙ
͓ئ͍ iOSDCશମɺτʔΫʹର͢ΔΞϯέʔτͷ ճΛΑΖ͓͘͠ئ͍͠·͢ʂ
ࠓͷτʔΫ
ࠓͷτʔΫ جૅলུɻ࣮ͰͲ͏͏ͷ͕ ͍͍͔ʹ͍ͭͯ͠·͢ɻ
ࠓͷτʔΫ ࢀՃܕͷτʔΫʹͳΓ·͢ʂ͓खݩʹ ࣗͷ.swiftlint.ymlΛஔ͍͍͚ͯͨͩΔͱɻ
ɾSwiftLintͷ࠷৽ͷใʹ͍ͭͯհ ɾΈͳ͞ΜͲͷϧʔϧΛͲͷΑ͏ʹ ɹ࠾༻ͯ͠·͔͢ʁ ɾࢲ͕ߟ͑Δ࠷ڧͷ.swiftlint.yml ɾCIपΓͷ ࠓͷ֓ཁ
SwiftLintͷ࠷৽ใ
ɾϧʔϧ૯105 ɾ2015/05/18ʹॳϦϦʔε ɾɾҎ߱ɺ42ճͷϦϦʔεΛॏͶ͍ͯΔ ɾStar7,700 SwiftLintͷࠓ ※͜͜Ͱͷใ2017/10/02࣌ͰͷใͰ͢
SwiftLint 1.0.0ʁ
SwiftLint0.22 ʢݱࡏͷ࠷৽verʣ
ɾωετ͞Εͨconfigͷѻ͍ͷมߋ ɾɾωετ͞Εͨࢠconfig·Δͬͱ ɹɹconfigͱஔ͖ΘΔͷͰͳ͘ɺ ɹɹͷconfigͱϚʔδ͞ΕΔ SwiftLint 0.22ͷओཁͳมߋ
ɾωετ͞Εͨconfigͷѻ͍ͷมߋ ɾɾωετ͞Εͨࢠconfig·Δͬͱ ɹɹconfigͱஔ͖ΘΔͷͰͳ͘ɺ ɹɹͷconfigͱϚʔδ͞ΕΔ SwiftLint 0.22ͷओཁͳมߋ ʁ
ɾલఏ ɾɾҟͳΔ.swiftlint.ymlΛɺҟͳΔ ɹɹσΟϨΫτϦ֊ʹஔ͘͜ͱͰ ɹɹͦΕͧΕʹ߹ͬͨϧʔϧΛద༻͢Δ ɹɹ͜ͱ͕Ͱ͖ͨ ωετ͞Εͨconfig
ɾ ᵓᴷᴷ ViewController.swift ᵓᴷᴷ .swiftlint.yml ᵋᴷᴷ Tests ᵋᴷᴷ Test.swift ᵋᴷᴷ
.swiftlint.yml ਤղ line_length: 110 disabled_rules: - force_cast - force_try
σΟϨΫτϦͱࢠσΟϨΫτϦ྆ํʹ .swiftlint.yml͕͋ͬͨ߹ ɾࠓ·Ͱ ɾɾࢠσΟϨΫτϦͰࢠσΟϨΫτϦͷ ɹɹ.swiftlint.yml͔͠ద༻͞Εͳ͔ͬͨ ωετ͞Εͨconfig
ਤղʢैདྷʣ TestsσΟϨΫτϦͰద༻͞ΕΔϧʔϧ TestsҎԼʹॻ͔Ε͍ͯΔϧʔϧͷΈ ɾ ᵓᴷᴷ ViewController.swift ᵓᴷᴷ .swiftlint.yml ᵋᴷᴷ Tests
ᵋᴷᴷ Test.swift ᵋᴷᴷ .swiftlint.yml line_length: 110 disabled_rules: - force_cast - force_try
ɾ0.22Ҏ߱ ɾɾࢠσΟϨΫτϦͱσΟϨΫτϦͷ ɹɹ.swiftlint.yml͕Ϛʔδ͞Εͨͷ͕ ɹɹࢠσΟϨΫτϦͰద༻͞ΕΔ ωετ͞Εͨconfig
ਤղʢ0.22Ҏ߱ʣ ɾ ᵓᴷᴷ ViewController.swift ᵓᴷᴷ .swiftlint.yml ᵋᴷᴷ Tests ᵋᴷᴷ Test.swift
ᵋᴷᴷ .swiftlint.yml line_length: 110 line_length: 110 disabled_rules: - force_cast - force_try Ϛʔδʂ ࢠσΟϨΫτϦͰσΟϨΫτϦͰ ࢦఆ͍ͯ͠Δϧʔϧద༻͞ΕΔ
ɾmessageͷͳ͍XCTFailڐ༰͠ͳ͍ ɾɾxctfail_message ɾ༨ͳdisableίϚϯυ͕ͳ͍͔νΣοΫ ɾɾsuperfluous_disable_command ɾɾʮ// swiftlint:disableʯΛͬͯΔ͚Ͳ ɹɹҾ͔͔ͬΔίʔυ͕ͳ͍࣌ʹΤϥʔ SwiftLint 0.22ͷओཁͳมߋ
SwiftLint0.21 ʢ࠷৽verͷ1ͭखલʣ
ɾରԠόʔδϣϯͷมߋ ɾɾXcode 8.3Ҏ্ɺSwift 3.1Ҏ্͕ඞਢ ɾϧʔϧΛੜ͢ΔίϚϯυͷՃ ɾɾswiftlint generate-docs SwiftLint 0.21ͷओཁͳมߋ
ɾΞΫηεम০ࢠʹؔ͢ΔϧʔϧͷՃ ɾɾprivate_over_fileprivate ɾɾɾTopLevelʹ͋Δfileprivateprivate ɾɾstrict_fileprivate ɾɾɾશͯͷfileprivateΛνΣοΫ ɾɾɾSwift4Ͱʹཱͭ SwiftLint 0.21ͷओཁͳมߋ
ɾઃఆΦϑʹͳ͍ͬͯΔϧʔϧҰཡΛग़ྗ͢Δ ɾɾswiftlint rules - - disabled ɾ৽͍͠ܗࣜͷKVOํࣜͰॻ͍͍ͯΔ͔ ɾɾblock_based_kvo ɾɾʮWhat's New
in Cocoa TouchʯͰ৽͍͠ ɹɹϒϩοΫϕʔεͷه๏͕հ͞Εͨ SwiftLint 0.21ͷओཁͳมߋ
ɾconfigͰڥม͕͑ΔΑ͏ʹ ɾɾ${ԿΒ͔ͷม}ͱॻ͚OK SwiftLint 0.21ͷओཁͳมߋ
ΈΜͳͷSwiftLintࣄ
ɾσϑΥϧτͰ༗ޮʹͳ͍ͬͯΔϧʔϧ ɾσϑΥϧτͰ120ӽ͑ͨΒܯࠂɺ200 ɹӽ͑ͨΒΤϥʔ ٞ̍ɿline_length
AppDelegateͷ༷͝ࢠ ٞ̍ɿline_length
ίϝϯτ͗ͯ͢Τϥʔൃੜ ٞ̍ɿline_length Έͳ͞ΜͲ͏ͯ͠·͔͢ʁ
ɾͲΜͳͱ͜ΖͰҾ͔͔ͬͬͯΔʁ ɾɾσϑΥͰೖ͍ͬͯΔίϝϯτ ɾɾඪ४ͷϝιου໊ ɾͲΜͳ࣌ʹ͍ίʔυΛॻ͍ͯ͠·͏ʁ ɾɾifͳͲͰ݅Λෳฒͨ࣌ ɾɾifͱreturnΛ1ߦͰ·ͱΊͨ࣌ ٞ̍ɿline_length
ɾࢲͷதͰͷ݁ ɾɾඪ४ϝιουͰҾ͔͔ͬΔͳΒ ɹɹແཧʹकΒͳ͍͍ͯ͘ͷͰʁ ɾɾ120ӽ͑Δ͘Β͍ͷίʔυΛॻ͍ͯ ɹɹ͠·ͬͨΒࣗͰదٓվߦ ɾɾline_lengthdisableͰ͍͍ͷͰʁ ٞ̍ɿline_length
ɾσϑΥϧτͰ༗ޮʹͳ͍ͬͯΔϧʔϧ ɾߦʹ༨ܭͳλϒɺۭനจࣈ͕ೖͬͯͨΒ ɹܯࠂ͕ग़Δ ٞ̎ɿtrailing_whitespace
ʢXcodeͷઃఆʹΑΔ͕ʣվߦ࣌ʹࣗಈ Ͱૠೖ͞ΕΔλϒʹ͍͍͍ͭͯͪͪ ݴΘΕΔͷ͏͍͟ʢʈωʈ#ʣűƅŝűƅŝ ٞ̎ɿtrailing_whitespace Έͳ͞ΜͲ͏ͯ͠·͔͢ʁ
ɾࢲͷதͰͷ݁ ɾɾશۭ֯നจࣈʮInvalid charactor in ɹɹsource fileʯΤϥʔ͕ग़Δͦ͠Μͳ ɹɹࠔΔ͜ͱͳ͍ͷͰʁ ɾɾtrailing_whitespacedisableͰ͍͍ʁ ٞ̎ɿtrailing_whitespace
ࢲ͕ߟ͑ͨ࠷ڧͷ .swiftlint.yml
͝ΊΜͳ͍͞ ؒʹ߹ͬͯͳ͍Ͱ͢
શ൛ޙQiitaͰ ΞΧϯτ@akatsuki174Ͱ͢
ࠓద༻ج४ͷ ͚ͩ͠·͢
ɾॻ͘ਓʹΑͬͯΒ͖͕ͭग़ͦ͏ͳ ɹࠣࡉͳ෦ϧʔϧΛద༻ͯ͠Χόʔ ɾɾcolon, comma, empty_parameters etc. ɾ୯ͳΔೖྗϛεͬΆ͍ͱ͜ΖΛࢦఠͯ͠ ɹ͘ΕΔϧʔϧద༻ ɾɾclosing_brace, closure_spacing
etc. ద༻ج४
ɾద༻͞Εͯͳ͍ͱෆ֨ͳϧʔϧద༻ ɾɾclosure_end_indentation, ɹɹclosure_parameter_position etc. ɾ߹ʹΑΔͷෆద༻ɺ͘͠ ɹ݅Λ͚Δ ɾɾforce_cast, identifier_name etc. ద༻ج४
ɾΓ͗͢͡ΌͶʁͬͯࢥͬͨΒෆద༻ ɾɾline_length, ɹɹconditional_returns_on_newline etc. ద༻ج४
CIपΓͷ
ɾPRΛग़ͨ࣌͠ʹDanger͕.swiftlint.ymlʹ ɹҾ͔͔ͬͬͯͳ͍͔νΣοΫ ɾɾҾ͔͔͍ͬͬͯͨΒ༰ࣻͳ͘ίϝϯτ ฐࣾͷ߹
ɾSwiftLintͷREADME.mdʹfastlaneͷ ɹactionͱͯ͑͠Δͱॻ͔Ε͍ͯΔ fastlane
SwiftLintΛͬͯ όϦόϦշద։ൃ͠·͠ΐ͏ʂ
͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ