Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Swift Concurrency 年表クイズ

Avatar for omochimetaru omochimetaru
November 02, 2025

Swift Concurrency 年表クイズ

Kanagawa.swift #2

Avatar for omochimetaru

omochimetaru

November 02, 2025
Tweet

More Decks by omochimetaru

Other Decks in Programming

Transcript

  1. 4XJGUόʔδϣϯૣݟද όʔδϣϯ ਪ͠ػೳ DPODVSSFODZҎ֎ 9DPEF EBUF J04  "EE3FTVMUUPUIF4UBOEBSE-JCSBSZ 

       1SPQFSUZ8SBQQFST     ,FZ1BUI&YQSFTTJPOTBT'VODUJPOT     .VMUJQMF5SBJMJOH$MPTVSFT     3FTVMU#VJMEFST     &YUFOEJOH4UBUJD.FNCFS-PPLVQJO(FOFSJD$POUFYUT     *OUSPEVDFFYJTUFOUJBMABOZA     *NQMJDJUMZ0QFOFE&YJTUFOUJBMT     🤔     7BMVFBOE5ZQF1BSBNFUFS1BDLT     🤔     5ZQFEUISPXT     "MMPXUSBJMJOHDPNNBJODPNNBTFQBSBUFEMJTUT     🤔   
  2. "TZODBXBJU ABTZODA ABXBJUAΛಋೖ let newURL = await server.redirectURL(for: url) let

    (data, response) = try await session.dataTask(with: newURL)
  3. 4USJDUDPODVSSFODZGPSHMPCBMWBSJBCMFT άϩʔόϧม਺ͷฒߦ҆શੑΛอূ (MPCBM$PODVSSFODZ final class NonSendable { var age: Int

    = 0 static let shared = NonSendable() // Error: Static property 'shared' is not concurrency- safe because non-'Sendable' type 'NonSendable' may have shared mutable state } let global = NonSendable() // Error: Let 'global' is not concurrency-safe because non-'Sendable' type 'NonSendable' may have shared mutable state
  4. @MainActor final class NonSendable { var age: Int = 0

    static let shared = NonSendable() } let global = NonSendable() w A!.BJO"DUPSA࠷ߴ
  5. %ZOBNJDBDUPSJTPMBUJPOFOGPSDFNFOUGSPNOPOTUSJDUDPODVSSFODZ DPOUFYUT ࣮ߦ࣌ʹJTPMBUJPOΛ֬ೝ͢Δ %ZOBNJD"DUPS*TPMBUJPO protocol ViewDelegateProtocol { // MainActor ࢦఆ͕ͳ͍ʂ

    func respondToUIEvent() } @MainActor class MyViewController: @preconcurrency ViewDelegateProtocol // @preconcurrency Λ෇͚Δͱແཧ΍Γ४ڌͰ͖Δɻ { func respondToUIEvent() { // ࣮ߦ࣌ʹ MainActor ͔Βདྷ͔ͨͲ͏͔ࣗಈͰνΣοΫ͢Δ } }
  6. 6TBCJMJUZPGHMPCBMBDUPSJTPMBUFEUZQFT (MPCBMBDUPSؔ࿈Ͱ࢖͍΍͕͢͞Ξοϓ (MPCBM"DUPS*TPMBUFE5ZQFT6TBCJMJUZ w 4UPSFEQSPQFSUJFTPG4FOEBCMFUZQFJOBHMPCBMBDUPSJTPMBUFEWBMVFUZQFDBOCF EFDMBSFEBTOPOJTPMBUFEXJUIPVUVTJOH VOTBGF  w 4UPSFEQSPQFSUJFTPG4FOEBCMFUZQFJOBHMPCBMBDUPSJTPMBUFEWBMVFUZQFBSFUSFBUFE

    BTOPOJTPMBUFEXIFOVTFEXJUIJOUIFNPEVMFUIBUEF fi OFTUIFQSPQFSUZ w !4FOEBCMFJTJOGFSSFEGPSHMPCBMBDUPSJTPMBUFEGVODUJPOTBOEDMPTVSFT w (MPCBMBDUPSJTPMBUFEDMPTVSFTBSFBMMPXFEUPDBQUVSFOPO4FOEBCMFWBMVFTEFTQJUF CFJOH!4FOEBCMF w "HMPCBMBDUPSJTPMBUFETVCDMBTTPGBOPOJTPMBUFE OPO4FOEBCMFDMBTTJTBMMPXFE  CVUJUNVTUCFOPO4FOEBCMF
  7. ͦΕ·Ͱ func fire(process: @escaping @MainActor @Sendable () -> Void) {

    Task { await process() } } άϩʔόϧΞΫλʔͳؔ਺͕ࣗಈͰ4FOEBCMFʹͳͬͨ ͦΕ͔Β func fire(process: @escaping @MainActor () -> Void) { Task { await process() } }
  8. (MPCBMBDUPSJTPMBUFEDPOGPSNBODFT (MPCBM"DUPSݶఆͰDPOGPSNͰ͖Δ 4XJGU @MainActor class MyModelType: @MainActor Equatable { var

    name: String init(name: String) { self.name = name } static func ==(lhs: MyModelType, rhs: MyModelType) -> Bool { lhs.name == rhs.name } } w ͜ΕϚδͰ೉͍͠ͱࢥ͍·͢ɻ
  9. %FGBVMUBDUPSJTPMBUJPOQFS fi MF ϑΝΠϧ୯ҐͰ!.BJO"DUPSʹͰ͖Δ %SBGU using @MainActor final class NonSendable

    { var age: Int = 0 static let shared = NonSendable() } let global = NonSendable() w A!.BJO"DUPSA࠷ߴ
  10. OPOJTPMBUFEGVODͷJTPMBUJPO @MainActor func main() async { await action() } nonisolated

    func action() async { // ͜͜͸ main executor Ͱ͢ } w ݪॳ͸Ҿ͖ܧ͍Ͱ͍ͨ
  11. $MBSJGZUIF&YFDVUJPOPG/PO"DUPS*TPMBUFE"TZOD'VODUJPOT OPOJTPMBUFE͸HMPCBMFYFDVUPSͰ૸Δ @MainActor func main() async { await action() }

    nonisolated func action() async { // ͜͜͸ main executor Ͱ͸͋Γ·ͤΜ } w BDUPSͷෛՙΛಀͨ͢Ί
  12. 4FOEBCMFͷνΣοΫ͕ਐΜͩ OPOTQFDJ fi DQSPQPTBM final class Foo { func run()

    async {} } actor MyActor { func main() async { let foo = Foo() await foo.run() // Error: passing argument of non-sendable type 'Foo' outside of actor-isolated context may introduce data races } } w ͳΜͱίϨ͕μϝ w AGPPA͕ӽڥ͍ͯ͠ΔͨΊ
  13. 3FHJPO#BTFE*TPMBUJPO EJTDPOOFDUFEͳΒӽڥͰ͖Δ final class Foo { func run() async {}

    } actor MyActor { func main() async { let foo = Foo() await foo.run() } } w AGPPA͕EJTDPOOFDUFE
  14. ͦ͏؁͘΋ͳ͍ final class Foo { func run() async {} }

    actor MyActor { let foo = Foo() func main() async { await foo.run() // sending 'self.foo' risks causing data races } } w AGPPA͕BDUPSJTPMBUFE
  15. *OIFSJUBODFPGBDUPSJTPMBUJPO "DUPSΛҾ͖ܧ͙ࢦఆ͕Ͱ͖Δ final class Foo { func run(isolation: isolated (any

    Actor)? = #isolation) async {} } actor MyActor { let foo = Foo() func main() async { await foo.run() } }
  16. 3VOOPOJTPMBUFEBTZODGVODUJPOTPOUIFDBMMFSTBDUPSCZEFGBVMU ཉ͔ͬͨ͠΍ͭ 4XJGU final class Foo { nonisolated(nonsending) func run()

    async {} } actor MyActor { let foo = Foo() func main() async { await foo.run() } } w AOPOJTPMBUFE OPOTFOEJOH AΛ͚ͭΕ͹ʮҾ͖ܧ͙ʯ
  17. /POJTPMBUFE/POTFOEJOH#Z%FGBVMU final class Foo { func run() async {} }

    actor MyActor { let foo = Foo() func main() async { await foo.run() } } w GFBUVSF fl BHͰࢦఆ΋লུɻ