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 Charts: Vectorized and function plots
Search
yamakentoc
June 28, 2024
Programming
2.2k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Swift Charts: Vectorized and function plots
yamakentoc
June 28, 2024
More Decks by yamakentoc
See All by yamakentoc
WWDC25:デザインセッションまとめ
yamakentoc
1
140
Swift × Android : How Skip is Shaping the Future of Cross-Platform Development
yamakentoc
0
580
Skip:Native Swift on Androidを理解する
yamakentoc
0
200
マルチプラットフォーム系はSkipで良さそうな話.pdf
yamakentoc
2
580
Pathのあまり知られてない部分を知る
yamakentoc
1
110
WWDC創設期から現在まで
yamakentoc
0
99
Xcodeの意外と知られてない機能
yamakentoc
1
190
既存アプリをVisionOSでビルドするコツ.pdf
yamakentoc
1
570
ARKitのすヽめ
yamakentoc
0
510
Other Decks in Programming
See All in Programming
Oxlintのカスタムルールの現況
syumai
6
1.1k
Observability in Practice:Grafana 與 Edge Device SRE 的那些事
blueswen
0
160
スマートグラスで並列バイブコーディング
hyshu
0
140
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
1
240
AIだと陥りがちなJakarta EE最新技術への移行時の落とし穴と解決策
tnagao7
0
110
Lessons from Spec-Driven Development
simas
PRO
0
190
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
7
1.6k
タクシーアプリ『GO』の バックエンド開発のおける AI利活用と若者のすべて
pyama86
3
2k
IBM Bobを活用したレガシーアプリの最新化
oniak3ibm
PRO
1
200
Vite+ Unified Toolchain for the Web
naokihaba
0
300
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
780
A2UI という光を覗いてみる
satohjohn
1
130
Featured
See All Featured
Product Roadmaps are Hard
iamctodd
PRO
55
12k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.7k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.3k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.4k
Balancing Empowerment & Direction
lara
6
1.2k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
840
Site-Speed That Sticks
csswizardry
13
1.2k
How STYLIGHT went responsive
nonsquared
100
6.2k
How Software Deployment tools have changed in the past 20 years
geshan
0
34k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.5k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
420
Transcript
ࢁޱݡొʢZBNBLFOʣ 4XJGU$IBSUT 7FDUPSJ[FEBOEGVODUJPOQMPUT
ࣗݾհ ໊લɿࢁޱݡొʢZBNBLFOʣ ॴଐɿ ͍ͬͯΔ͜ͱɿ 5XJUUFSɿ!ZBNBLFOUPD
͢༰ w 4XJGU$IBSUTͷΞοϓσʔτʹ͍ͭͯ w Ξοϓσʔτ༰͚ͩฉ͍ͯΑ͘Θ͔Βͳ͍ͱࢥ͏ͷͰɺ ͦͷલʹ4XJGU$IBSUTͷ͓͞Β͍ Ҿ༻ݩɿIUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED
4XJGU$IBSUTͷ͓͞Β͍ w 88%$Ͱൃද͞ΕͨάϥϑඳըͷGSBNFXPSL w l.BSLzΛ֤ͬͯάϥϑΛඳըͰ͖Δ Ҿ༻ݩɿIUUQTEFWFMPQFSBQQMFDPNEFTJHOIVNBOJOUFSGBDFHVJEFMJOFTDIBSUT IUUQTEFWFMPQFSBQQMFDPNKQWJEFPTQMBZXXED
4XJGU$IBSUTͷ͓͞Β͍ w άϥϑΛඳը͍ͨ͠߹#BS.BSLΛ༻ w ͍ίʔυ͚ͩͰ؆୯ʹάϥϑΛඳըͰ͖Δ import SwiftUI import Charts struct
BarChartView: View { let dataList = [ (month: "Jan", value: 20), (month: "Feb", value: 60), (month: "Mar", value: 45) ] var body: some View { Chart(dataList, id: \.month) { BarMark( x: .value("Month", $0.month), y: .value("Value", $0.value) ) } } }
w ԁάϥϑ͕ඳըͰ͖ΔΑ͏ʹͳͬͨΓ 88%$Ͱʜ Ҿ༻ݩɿIUUQTEFWFMPQFSBQQMFDPNKQWJEFPTQMBZXXED
w ΑΓ؆୯ʹΠϯλϥΫςΟϒͳػೳ͕ՃͰ͖ΔΑ͏ʹͳͬͨΓ 88%$Ͱʜ Ҿ༻ݩɿIUUQTEFWFMPQFSBQQMFDPNKQWJEFPTQMBZXXED
w εΫϩʔϧՄೳʹͳͬͨΓ͠·ͨ͠ 88%$Ͱʜ Ҿ༻ݩɿIUUQTEFWFMPQFSBQQMFDPNKQWJEFPTQMBZXXED
88%$Ͱʜ w ͦͷଞʹ༷ʑͳΞοϓσʔτ͕ೖΓ·͕ͨ͠ɺ ৄࡉʮ4XJGU$IBSUT·ͱΊʯͱ͍͏ͷهࣄΛಡΜͰΈ͍ͯͩ͘͞ɻ Ҿ༻ݩɿIUUQTRJJUBDPNZBNBLFOUPDJUFNTBECDBG ͍͍Ͷ͍ͩ͘͞
88%$Ͱͷ4XJGU$IBSUTͷΞοϓσʔτ w ؔΛͬͯάϥϑΛඳըͰ͖ΔΑ͏ʹͳͬͨ Ҿ༻ݩɿIUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED
88%$Ͱͷ4XJGU$IBSUTͷΞοϓσʔτ w ؔΛͬͯάϥϑΛඳըͰ͖ΔΑ͏ʹͳͬͨ w େنͳσʔλΛΑΓޮతʹॲཧͰ͖ΔΑ͏ʹͳͬͨ Ҿ༻ݩɿIUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED
88%$Ͱͷ4XJGU$IBSUTͷΞοϓσʔτ w ؔΛͬͯάϥϑΛඳըͰ͖ΔΑ͏ʹͳͬͨ w େنͳσʔλΛΑΓޮతʹॲཧͰ͖ΔΑ͏ʹͳͬͨ Ҿ༻ݩɿIUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED
ؔΛͬͯάϥϑΛඳըͰ͖ΔΑ͏ʹͳͬͨ w ࠓ·Ͱz.BSLzΛͬͯάϥϑΛඳը͍ͯͨ͠ʢ-JOF.BSL "SFB.BSL ʜʣ w ৽͘͠z1MPUzͱ͍͏ͷ͕ੜʢ-JOF1MPU "SFB1MPU ʜʣ w
1MPUΛ͏͜ͱͰؔΛͬͯάϥϑΛඳըՄೳʹ Ҿ༻ݩɿIUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED
w ͭͷؔΛάϥϑʹඳըͰ͖Δ -JOF1MPU Ҿ༻ݩɿIUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED
w ྫ͑ʮ ʯΛඳը͍ͨ͠߹ y = x2 -JOF1MPU Chart { LinePlot(x:
"x", y: "y") { x in x * x // y=x^2 } } .chartXScale(domain: -5...5) // X࣠ͷൣғ .chartYScale(domain: -5...5) // Y࣠ͷൣғ ˞Πϝʔδ Ҿ༻ݩɿIUUQTXXXHFPHFCSBPSHHSBQIJOH MBOHKB
w ؔͷྖҬΛຒΊΔ͜ͱ͕Ͱ͖Δ "SFB1MPU Ҿ༻ݩɿIUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED
"SFB1MPU w ͭͷؔͷؒͷྖҬΛຒΊΔ͜ͱͰ͖Δ Ҿ༻ݩɿIUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED
"SFB1MPU w ͱ ͷྖҬΛຒΊΔ߹ y = x + 1 y
= x2 Chart { AreaPlot(x: "x", yStart: "x + 1", yEnd: "x^2") { x in (yStart: x + 1, yEnd: x * x) } } .chartXScale(domain: -5...5) // X࣠ͷൣғ .chartYScale(domain: -5...5) // Y࣠ͷൣғ Ҿ༻ݩɿIUUQTXXXHFPHFCSBPSHHSBQIJOH MBOHKB ˞Πϝʔδ
άϥϑͷදࣔൣғΛઃఆ͢Δ w දࣔൣғΛઃఆ͢Δ߹DIBSU94DBMF EPNBJO Λ༻ Ҿ༻ݩɿIUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED
άϥϑͷग़ྗൣғΛઃఆ͢Δ w ҾEPNBJOͰYͷൣғΛࢦఆ͢Δ Ҿ༻ݩɿIUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED
,FZOPUFͰɺखॻ͖ͷܭࢉ͔ࣜΒάϥϑΛඳը͢Δγʔϯ͕͋ͬͨ $IBSUTͰؔΛάϥϑԽ͢ΔػೳΛ͍ͬͯΔ͜ͱ͕Θ͔Δ Ҿ༻ݩɿIUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED
ύϥϝτϦοΫؔѻ͏͜ͱ͕Ͱ͖Δ w ύϥϝτϦοΫؔʢ1BSBNFUSJDGVODUJPOʣͱʜ w ಛఆͷύϥϝʔλʢྫ͑࣌ؒʣΛͬͯɺෳͷมʢҐஔͳͲʣΛಉ ࣌ʹදؔ͢ w ྫ͑ʮܘSͷԁʯҎԼͷΑ͏ʹදͤΔ x(t) =
r cos(t) y(t) = r sin(t)
ܘͷԁΛඳը͢Δ߹ w ܘͷԁΛදؔ͢ x(t) = 2 cos(t) y(t) = 2
sin(t) Chart { LinePlot(x: "x", y: "y", t: "t", domain: -.pi ... .pi) { t in let x = 2 * cos(t) let y = 2 * sin(t) return (x, y) } } .chartXScale(domain: -5...5) .chartYScale(domain: -5...5) ˞Πϝʔδ Ҿ༻ݩɿIUUQTXXXHFPHFCSBPSHHSBQIJOH MBOHKB
ϋʔτΛඳը͢Δ߹ x(t) = 2 sin3(t) y(t) = cos(t)(2 − cos(t)
− cos2(t)) Ҿ༻ݩɿIUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED
۠ؔѻ͏͜ͱ͕Ͱ͖Δ w ۠ؔʢ1JFDFXJTFGVODUJPOʣͱʜ w ۠͝ͱʹҟͳΔؔΛద༻͢Δؔ f(x) = { x2 JG
x > 0 −x2 JG x ≤ 0 Chart { LinePlot(x: "x", y: "y") { x in if x > 0 { x * x // y=x^2 } else { -x * x // y=-x^2 } } } .chartXScale(domain: -5...5) .chartYScale(domain: -5...5) Ҿ༻ݩɿIUUQTXXXHFPHFCSBPSHHSBQIJOH MBOHKB ˞Πϝʔδ
۠ؔͰग़ྗ͕ͳ͍߹ w ۠ʹΑͬͯ6OEF fi OFEͷ͜ͱ͋Δ w OBOΛࢦఆ͢Δ͜ͱͰग़ྗ͕ͳ͍͜ͱΛ௨ f(x) =
{ x2 JG x > 0 6OEF fi OFE JG x ≤ 0 Chart { LinePlot(x: "x", y: "y") { x in if x > 0 { x * x // y=x^2 } else { .nan // ग़ྗ͕ͳ͍͜ͱΛ௨ } } } .chartXScale(domain: -5...5) .chartYScale(domain: -5...5) ˞Πϝʔδ Ҿ༻ݩɿIUUQTXXXHFPHFCSBPSHHSBQIJOH MBOHKB
w ྫ͑ҎԼͷؔͷ߹ɺYʹͳΔͱʮ ʯͱͳΓɺΤϥʔʹͳΔͷͰආ͚ Δඞཁ͕͋Δɻ͜ͷ߹OBOΛࢦఆ͢Δ͜ͱͰճආ͢Δ͜ͱ͕Ͱ͖Δ 1 0 ۠ؔͰग़ྗ͕ͳ͍߹ y = {
6OEF fi OFE JG x = 0 1 x JG x ≠ 0 Chart { LinePlot(x: "x", y: "y") { x in if x != 0 { 1 / x } else { .nan // ग़ྗ͕ͳ͍͜ͱΛ௨ } } } .chartXScale(domain: -5...5) .chartYScale(domain: -5...5) ˞Πϝʔδ Ҿ༻ݩɿIUUQTXXXHFPHFCSBPSHHSBQIJOH MBOHKB
88%$Ͱͷ4XJGU$IBSUTͷΞοϓσʔτ w ؔΛͬͯάϥϑΛඳըͰ͖ΔΑ͏ʹͳͬͨ w େنͳσʔλΛΑΓޮతʹॲཧͰ͖ΔΑ͏ʹͳͬͨ Ҿ༻ݩɿIUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED
େنͳσʔλΛΑΓޮతʹॲཧͰ͖ΔΑ͏ʹͳͬͨ w 1MPU-JOF1MPU "SFB1MPUҎ֎ʹɺશͯͷ.BSLʹରͯ͠1MPU͕Ճ͞Εͨ w ͜ΕΒͷ1MPUΛ͏͜ͱͰɺίϨΫγϣϯશମΛฒྻʹѻ͏͜ͱ͕Ͱ͖ɺ େنͳσʔλޮతʹॲཧͰ͖ΔΑ͏ʹͳͬͨ w ͓ͦΒ͘.BSLͩͱσʔλྻͰѻΘΕ͍ͯͨ Ҿ༻ݩɿIUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED
#BS.BSLͷఆٛํ๏ let dataList = [ (month: "Jan", value: 20), (month:
"Feb", value: 60), (month: "Mar", value: 45) ] … Chart(dataList, id: \.month) { BarMark( x: .value("Month", $0.month), y: .value("Value", $0.value) ) } w %BUBΛ$IBSUʹ͠ɺWBMVFͷΑ͏ʹΛࢦఆ͍ͯͨ͠
#BS1MPUͷఆٛํ๏ w %BUBΛ#BS1MPUͷҾʹ͠ɺ,FZ1BUIͰΛࢦఆՄೳʹͳͬͨ let dataList = [ (month: "Jan", value:
20), (month: "Feb", value: 60), (month: "Mar", value: 45) ] … Chart(dataList, id: \.month) { BarMark( x: .value("Month", $0.month), y: .value("Value", $0.value) ) } let dataList = [ (month: "Jan", value: 20), (month: "Feb", value: 60), (month: "Mar", value: 45) ] … Chart { BarPlot( dataList, x: .value("Month", \.month), y: .value("Value", \.value) ) }
ηογϣϯͰ͜Μͳදݱ w ӈਤΞϝϦΧͷιʔϥʔύωϧͷઃஔҐஔΛࣔͨ͠ͷ w ઃஔҐஔΛҢܦ͔Β1PJOU1MPUͰඳը w ਤࣗମ-JOF1MPUͰඳը w 4XJGU$IBSUT͕͋ΕԿͰඳ͚Δʜ Ҿ༻ݩɿIUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPODIBSUTDSFBUJOHBEBUBWJTVBMJ[BUJPOEBTICPBSEXJUITXJGUDIBSUT
1MPUͱ.BSLͷͲͪΒΛ͏͖͔ʁ w େنͳσʔληοτ͔ͭɺάϥϑશମ ͷݟ͕ͨγϯϓϧͳΧελϚΠζͷ ߹ʹ1MPUΛ͏͖ w σʔλগͳ͍͕ɺσʔλϙΠϯτ͝ͱ ʹݟͨͷΧελϚΠζΛ͢Δ߹ɺ [*OEFYΛͬͯෳࡶͳ֊Խ͕ඞཁͳ ߹.BSLΛ͏
1MPU .BSL Ҿ༻ݩɿIUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED
1MPUͷύϑΥʔϚϯεΛ্͛Δํ๏ w ༻͢ΔελΠϧ͝ͱʹσʔλͷίϨΫγϣϯΛάϧʔϓԽ͢Δ͜ͱͰɺ 4XJGU$IBSUT͕ελΠϧͷมߋճΛݮΒ͢͜ͱ͕Ͱ͖Δ w 1MPUͰDPNQVUFEϓϩύςΟͷར༻Λආ͚ɺ4UPSFEϓϩύςΟʹ͢Δ͜ͱ ͰϨϯμϦϯάॲཧΛܰݮͰ͖Δ w άϥϑͷදࣔ͢Δൣғ EPNBJO
Λ༧Ίࢦఆ͢Δ͜ͱͰΑΓޮతʹඳը͞Ε Δ w Ұ෦ͷελΠϧͷΧελϚΠζɺେྔͷσʔλϙΠϯτͰཱͨͳ͘ͳΔ ͷ͕ҰൠతͳͷͰɺελΠϧͷΧελϚΠζΛ͠ͳ͍ํ͕ɺάϥϑͷύϑΥʔ ϚϯεΛ্ͤ͞Δ͜ͱ͕Ͱ͖Δ
αϯϓϧ͋Δ Ҿ༻ݩɿIUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPODIBSUTDSFBUJOHBEBUBWJTVBMJ[BUJPOEBTICPBSEXJUITXJGUDIBSUT
·ͱΊ w ؔΛͬͯάϥϑΛඳըͰ͖ΔΑ͏ʹͳͬͨ w -JOF1MPUɿͭͷؔΛඳըͰ͖Δ w "SFB1MPUɿͭͷؔͷؒΛຒΊΔ͜ͱ͕Ͱ͖Δ w ύϥϝτϦοΫؔ۠ؔ༻Ͱ͖Δ w
େنͳσʔλΛΑΓޮతʹॲཧͰ͖ΔΑ͏ʹͳͬͨ w 1MPUΛ͏͜ͱͰฒྻʹσʔλΛॲཧͰ͖Δ w 1MPUͰ,FZ1BUIͰΛࢦఆͰ͖Δ w 1MPUͷύϑΥʔϚϯεΛ্͛Δํ๏͕͋Δ
ࢀߟࢿྉ w IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED w IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPODIBSUTDSFBUJOHBEBUB WJTVBMJ[BUJPOEBTICPBSEXJUITXJGUDIBSUT w IUUQTRJJUBDPNZBNBLFOUPDJUFNTBECDBG