Share
Embed
レシート印刷が途中で止まる?Stream APIとBluetooth接続のルールを守って楽しくレシートプリンターで印刷しよう! / iOSDC Japan 2025 satoryo
satoryo56
September 19, 2025
Transcript
156 slides
-
satoryo STORES גࣜձࣾ iOSɾAndroidΤϯδχΞ ࣗݾհ X(Twitter): @satoryo056 ࠓͷ WWDC25
ʹॳࢀՃʂ iOSDC ॳొஃͰ40τʔΫʂ -
4%,Λར༻ͨ͠Ϩγʔτҹͷ࣮ྫ // 1. ϓϦϯλʔݕࡧ let manager = StarDeviceDiscoveryManager() let
printers = try await manager.discoverPrinters() // 2. ϓϦϯλʔଓ guard let printer = printers.first else { return } let starPrinter = StarPrinter(connectionSettings: printer.connectionSettings) ελʔਫ਼ີ4UBS9QBOE4%,ͷ߹ // 3. Ϩγʔτ࡞ let builder = StarXpandCommand.DocumentBuilder() builder.addPrinter( StarXpandCommand.PrinterBuilder() .styleAlignment(.center) .styleBold(true) .actionPrintText("Ϩγʔτ\n") .styleBold(false) .styleAlignment(.left) .actionPrintText("໊: ίʔώʔ\n") .actionPrintText("ֹۚ: ¥300\n") .actionCut(.partial) ) // 4. ҹ࣮ߦ let commands = builder.getCommands() try await starPrinter.print(command: commands) Ҿ༻ɿIUUQTHJUIVCDPNTUBSNJDSPOJDT4UBS9QBOE4%,J04 -
4%,Λར༻ͨ͠Ϩγʔτҹͷ࣮ྫ // 1. ϓϦϯλʔݕࡧ let manager = StarDeviceDiscoveryManager() let
printers = try await manager.discoverPrinters() // 2. ϓϦϯλʔଓ guard let printer = printers.first else { return } let starPrinter = StarPrinter(connectionSettings: printer.connectionSettings) ελʔਫ਼ີ4UBS9QBOE4%,ͷ߹ // 3. Ϩγʔτ࡞ let builder = StarXpandCommand.DocumentBuilder() builder.addPrinter( StarXpandCommand.PrinterBuilder() .styleAlignment(.center) .styleBold(true) .actionPrintText("Ϩγʔτ\n") .styleBold(false) .styleAlignment(.left) .actionPrintText("໊: ίʔώʔ\n") .actionPrintText("ֹۚ: ¥300\n") .actionCut(.partial) ) // 4. ҹ࣮ߦ let commands = builder.getCommands() try await starPrinter.print(command: commands) Ҿ༻ɿIUUQTHJUIVCDPNTUBSNJDSPOJDT4UBS9QBOE4%,J04 -
4%,Λར༻ͨ͠Ϩγʔτҹͷ࣮ྫ // 1. ϓϦϯλʔݕࡧ let manager = StarDeviceDiscoveryManager() let
printers = try await manager.discoverPrinters() // 2. ϓϦϯλʔଓ guard let printer = printers.first else { return } let starPrinter = StarPrinter(connectionSettings: printer.connectionSettings) ελʔਫ਼ີ4UBS9QBOE4%,ͷ߹ // 3. Ϩγʔτ࡞ let builder = StarXpandCommand.DocumentBuilder() builder.addPrinter( StarXpandCommand.PrinterBuilder() .styleAlignment(.center) .styleBold(true) .actionPrintText("Ϩγʔτ\n") .styleBold(false) .styleAlignment(.left) .actionPrintText("໊: ίʔώʔ\n") .actionPrintText("ֹۚ: ¥300\n") .actionCut(.partial) ) // 4. ҹ࣮ߦ let commands = builder.getCommands() try await starPrinter.print(command: commands) Ҿ༻ɿIUUQTHJUIVCDPNTUBSNJDSPOJDT4UBS9QBOE4%,J04 -
4%,Λར༻ͨ͠Ϩγʔτҹͷ࣮ྫ // 1. ϓϦϯλʔݕࡧ let manager = StarDeviceDiscoveryManager() let
printers = try await manager.discoverPrinters() // 2. ϓϦϯλʔଓ guard let printer = printers.first else { return } let starPrinter = StarPrinter(connectionSettings: printer.connectionSettings) ελʔਫ਼ີ4UBS9QBOE4%,ͷ߹ // 3. Ϩγʔτ࡞ let builder = StarXpandCommand.DocumentBuilder() builder.addPrinter( StarXpandCommand.PrinterBuilder() .styleAlignment(.center) .styleBold(true) .actionPrintText("Ϩγʔτ\n") .styleBold(false) .styleAlignment(.left) .actionPrintText("໊: ίʔώʔ\n") .actionPrintText("ֹۚ: ¥300\n") .actionCut(.partial) ) // 4. ҹ࣮ߦ let commands = builder.getCommands() try await starPrinter.print(command: commands) Ҿ༻ɿIUUQTHJUIVCDPNTUBSNJDSPOJDT4UBS9QBOE4%,J04 -
4%,Λར༻ͨ͠Ϩγʔτҹͷ࣮ྫ // 1. ϓϦϯλʔݕࡧ let manager = StarDeviceDiscoveryManager() let
printers = try await manager.discoverPrinters() // 2. ϓϦϯλʔଓ guard let printer = printers.first else { return } let starPrinter = StarPrinter(connectionSettings: printer.connectionSettings) ελʔਫ਼ີ4UBS9QBOE4%,ͷ߹ // 3. Ϩγʔτ࡞ let builder = StarXpandCommand.DocumentBuilder() builder.addPrinter( StarXpandCommand.PrinterBuilder() .styleAlignment(.center) .styleBold(true) .actionPrintText("Ϩγʔτ\n") .styleBold(false) .styleAlignment(.left) .actionPrintText("໊: ίʔώʔ\n") .actionPrintText("ֹۚ: ¥300\n") .actionCut(.partial) ) // 4. ҹ࣮ߦ let commands = builder.getCommands() try await starPrinter.print(command: commands) Ҿ༻ɿIUUQTHJUIVCDPNTUBSNJDSPOJDT4UBS9QBOE4%,J04 -
4%,Λར༻ͨ͠Ϩγʔτҹͷ࣮ྫ // 1. ϓϦϯλʔݕࡧ let manager = StarDeviceDiscoveryManager() let
printers = try await manager.discoverPrinters() // 2. ϓϦϯλʔଓ guard let printer = printers.first else { return } let starPrinter = StarPrinter(connectionSettings: printer.connectionSettings) ελʔਫ਼ີ4UBS9QBOE4%,ͷ߹ // 3. Ϩγʔτ࡞ let builder = StarXpandCommand.DocumentBuilder() builder.addPrinter( StarXpandCommand.PrinterBuilder() .styleAlignment(.center) .styleBold(true) .actionPrintText("Ϩγʔτ\n") .styleBold(false) .styleAlignment(.left) .actionPrintText("໊: ίʔώʔ\n") .actionPrintText("ֹۚ: ¥300\n") .actionCut(.partial) ) // 4. ҹ࣮ߦ let commands = builder.getCommands() try await starPrinter.print(command: commands) ࢀߟɿIUUQTHJUIVCDPNTUBSNJDSPOJDT4UBS9QBOE4%,J04 গͳ͍ߦͰ Ϩγʔτҹ͕Մೳʂ -
4503&4Ϩδ͕αϙʔτ͢ΔϨγʔτϓϦϯλʔͷҰ෦ &QTPO ελʔਫ਼ີ ͦͷଞ ਾ͑ஔ͖ܕ ਾ͑ஔ͖ܕ υϩϫʔҰମܕ ख࣋ͪܕ ηΠίʔΠϯεπϧ
ख࣋ͪܕ ख࣋ͪܕ λϒϨοτҰମܕ Ҿ༻ɿIUUQTSFHJGBRTUPSFTKQIDKBBSUJDMFT -
4503&4Ϩδ͕αϙʔτ͢ΔϨγʔτϓϦϯλʔͷҰ෦ &QTPO ελʔਫ਼ີ ͦͷଞ ਾ͑ஔ͖ܕ ਾ͑ஔ͖ܕ υϩϫʔҰମܕ ख࣋ͪܕ ηΠίʔΠϯεπϧ
ख࣋ͪܕ ख࣋ͪܕ λϒϨοτҰମܕ Ҿ༻ɿIUUQTSFHJGBRTUPSFTKQIDKBBSUJDMFT -
4503&4Ϩδ͕αϙʔτ͢ΔϨγʔτϓϦϯλʔͷҰ෦ &QTPO ελʔਫ਼ີ ͦͷଞ ਾ͑ஔ͖ܕ ਾ͑ஔ͖ܕ υϩϫʔҰମܕ ख࣋ͪܕ ηΠίʔΠϯεπϧ
ख࣋ͪܕ ख࣋ͪܕ λϒϨοτҰମܕ Ҿ༻ɿIUUQTSFHJGBRTUPSFTKQIDKBBSUJDMFT -
4503&4Ϩδ͕αϙʔτ͢ΔϨγʔτϓϦϯλʔͷҰ෦ &QTPO ελʔਫ਼ີ ͦͷଞ ਾ͑ஔ͖ܕ ਾ͑ஔ͖ܕ υϩϫʔҰମܕ ख࣋ͪܕ ηΠίʔΠϯεπϧ
ख࣋ͪܕ ख࣋ͪܕ λϒϨοτҰମܕ Ҿ༻ɿIUUQTSFHJGBRTUPSFTKQIDKBBSUJDMFT -
4503&4Ϩδ͕αϙʔτ͢ΔϨγʔτϓϦϯλʔͷҰ෦ &QTPO ελʔਫ਼ີ ͦͷଞ ਾ͑ஔ͖ܕ ਾ͑ஔ͖ܕ υϩϫʔҰମܕ ख࣋ͪܕ ηΠίʔΠϯεπϧ
ख࣋ͪܕ ख࣋ͪܕ λϒϨοτҰମܕ Ҿ༻ɿIUUQTSFHJGBRTUPSFTKQIDKBBSUJDMFT -
4503&4Ϩδ͕αϙʔτ͢ΔϨγʔτϓϦϯλʔͷҰ෦ &QTPO ελʔਫ਼ີ ͦͷଞ ਾ͑ஔ͖ܕ ਾ͑ஔ͖ܕ υϩϫʔҰମܕ ख࣋ͪܕ ηΠίʔΠϯεπϧ
ख࣋ͪܕ ख࣋ͪܕ λϒϨοτҰମܕ Ҿ༻ɿIUUQTSFHJGBRTUPSFTKQIDKBBSUJDMFT -
طଘͷଓࡁΈΞΫηαϦΛεΩϟϯ͢Δ߹ // ௨ొ EAAccessoryManager.shared().registerForLocalNotifications() let accessories = EAAccessoryManager.shared().connectedAccessories for
accessory in accessories { // accessory: EAAccessory ͔ΒϨγʔτϓϦϯλʔΛݕࡧ } ϨγʔτϓϦϯλʔΛ୳͢ -
طଘͷଓࡁΈΞΫηαϦΛεΩϟϯ͢Δ߹ // ௨ొ EAAccessoryManager.shared().registerForLocalNotifications() let accessories = EAAccessoryManager.shared().connectedAccessories for
accessory in accessories { // accessory: EAAccessory ͔ΒϨγʔτϓϦϯλʔΛݕࡧ } ϨγʔτϓϦϯλʔΛ୳͢ -
طଘͷଓࡁΈΞΫηαϦΛεΩϟϯ͢Δ߹ // ௨ొ EAAccessoryManager.shared().registerForLocalNotifications() let accessories = EAAccessoryManager.shared().connectedAccessories for
accessory in accessories { // accessory: EAAccessory ͔ΒϨγʔτϓϦϯλʔΛݕࡧ } ϨγʔτϓϦϯλʔΛ୳͢ ଓࡁΈΞΫηαϦΛऔಘ -
طଘͷଓࡁΈΞΫηαϦΛεΩϟϯ͢Δ߹ // ௨ొ EAAccessoryManager.shared().registerForLocalNotifications() let accessories = EAAccessoryManager.shared().connectedAccessories for
accessory in accessories { // accessory: EAAccessory ͔ΒϨγʔτϓϦϯλʔΛݕࡧ } ϨγʔτϓϦϯλʔΛ୳͢ ଓࡁΈΞΫηαϦ͔Βݕࡧ -
ϨγʔτϓϦϯλʔΛ୳͢ ৽نΞΫηαϦΛεΩϟϯ͢Δ߹ /// BluetoothΞΫηαϦϐοΧʔΛදࣔ public func showBluetoothAccessoryPicker( nameFilter:
NSPredicate? = nil ) async throws { try await EAAccessoryManager .shared() .showBluetoothAccessoryPicker( withNameFilter: nameFilter ) } -
ϨγʔτϓϦϯλʔΛ୳͢ ৽نΞΫηαϦΛεΩϟϯ͢Δ߹ /// BluetoothΞΫηαϦϐοΧʔΛදࣔ public func showBluetoothAccessoryPicker( nameFilter:
NSPredicate? = nil ) async throws { try await EAAccessoryManager .shared() .showBluetoothAccessoryPicker( withNameFilter: nameFilter ) } -
ϨγʔτϓϦϯλʔΛ୳͢ ৽نΞΫηαϦΛεΩϟϯ͢Δ߹ /// BluetoothΞΫηαϦϐοΧʔΛදࣔ public func showBluetoothAccessoryPicker( nameFilter:
NSPredicate? = nil ) async throws { try await EAAccessoryManager .shared() .showBluetoothAccessoryPicker( withNameFilter: nameFilter ) } ΞΫηαϦ໊ͰߜΓࠐΈՄೳ -
ϨγʔτϓϦϯλʔΛ୳͢ ৽نΞΫηαϦΛεΩϟϯ͢Δ߹ /// BluetoothΞΫηαϦϐοΧʔΛදࣔ public func showBluetoothAccessoryPicker( nameFilter:
NSPredicate? = nil ) async throws { try await EAAccessoryManager .shared() .showBluetoothAccessoryPicker( withNameFilter: nameFilter ) } -
ଓ௨ͷࢹ let connectToken = NotificationCenter.default.addObserver( forName: .EAAccessoryDidConnect, object: nil,
queue: .main ) { [weak self] notification in // ଓͨ͠ϨγʔτϓϦϯλʔΛอ࣋ let accessory = notification.object as? EAAccessory … } notificationTokens.append(connectToken) ϨγʔτϓϦϯλʔΛ୳͢ -
ଓ௨ͷࢹ let connectToken = NotificationCenter.default.addObserver( forName: .EAAccessoryDidConnect, object: nil,
queue: .main ) { [weak self] notification in // ଓͨ͠ϨγʔτϓϦϯλʔΛอ࣋ let accessory = notification.object as? EAAccessory … } notificationTokens.append(connectToken) ϨγʔτϓϦϯλʔΛ୳͢ ΞΫηαϦͱଓͨ࣌͠ʹ௨ -
ଓ௨ͷࢹ let connectToken = NotificationCenter.default.addObserver( forName: .EAAccessoryDidConnect, object: nil,
queue: .main ) { [weak self] notification in // ଓͨ͠ϨγʔτϓϦϯλʔΛอ࣋ let accessory = notification.object as? EAAccessory … } notificationTokens.append(connectToken) ϨγʔτϓϦϯλʔΛ୳͢ -
அ௨ͷࢹ let disconnectToken = NotificationCenter.default.addObserver( forName: .EAAccessoryDidDisconnect, object: nil,
queue: .main ) { [weak self] notification in // அͨ͠ϨγʔτϓϦϯλʔΛআ } notificationTokens.append(disconnectToken) ϨγʔτϓϦϯλʔΛ୳͢ -
அ௨ͷࢹ let disconnectToken = NotificationCenter.default.addObserver( forName: .EAAccessoryDidDisconnect, object: nil,
queue: .main ) { [weak self] notification in // அͨ͠ϨγʔτϓϦϯλʔΛআ } notificationTokens.append(disconnectToken) ϨγʔτϓϦϯλʔΛ୳͢ ΞΫηαϦͱஅͨ࣌͠ʹ௨ -
// վߦίϚϯυ public func lineFeedCommand() -> Data { Data([0x0A])
} // ςΩετҹίϚϯυ public func textCommand(_ text: String) -> Data { text.data(using: .utf8) ?? Data() } // ςΩετΛଠࣈʹ͢ΔίϚϯυ public func boldCommand(_ enabled: Bool) -> Data { let value: UInt8 = enabled ? 0x01 : 0x00 return Data([0x1B, 0x45, value]) } ϝʔΧʔڞ௨ίϚϯυͷྫ ҹ͢ΔϨγʔτσʔλΛ࡞͢Δ -
// վߦίϚϯυ public func lineFeedCommand() -> Data { Data([0x0A])
} // ςΩετҹίϚϯυ public func textCommand(_ text: String) -> Data { text.data(using: .utf8) ?? Data() } // ςΩετΛଠࣈʹ͢ΔίϚϯυ public func boldCommand(_ enabled: Bool) -> Data { let value: UInt8 = enabled ? 0x01 : 0x00 return Data([0x1B, 0x45, value]) } ϝʔΧʔڞ௨ίϚϯυͷྫ ҹ͢ΔϨγʔτσʔλΛ࡞͢Δ %BUBܕΛฦ͢ -
// ϨγʔτΛΧοτʢஅʣ͢ΔίϚϯυ public func cutPaperCommand() -> Data { Data([0x1D,
0x56, 0x00]) } // ը૾Λҹ͢ΔͨΊͷίϚϯυ public func bitmapCommand(_ data: Data, width: Int, height: Int) -> Data { var command = Data() // ϏοτϚοϓҹίϚϯυ command.append(Data([0x1D, 0x76, 0x30, 0x00])) // ෯ͱߴ͞ command.append(Data([UInt8(width & 0xFF), UInt8((width >> 8) & 0xFF)])) command.append(Data([UInt8(height & 0xFF), UInt8((height >> 8) & 0xFF)])) // ϏοτϚοϓσʔλ command.append(data) return command } &QTPOϨγʔτϓϦϯλʔ༻ίϚϯυͷྫ ҹ͢ΔϨγʔτσʔλΛ࡞͢Δ -
// ϨγʔτΛΧοτʢஅʣ͢ΔίϚϯυ public func cutPaperCommand() -> Data { Data([0x1B,
0x64, 0x00]) } // ը૾Λҹ͢ΔͨΊͷίϚϯυ public func bitmapCommand(_ data: Data, width: Int, height: Int) -> Data { var command = Data() // ϏοτϚοϓҹίϚϯυ command.append(Data([0x1B, 0x58])) // ෯ͱߴ͞ command.append(Data([UInt8(width & 0xFF), UInt8((width >> 8) & 0xFF)])) command.append(Data([UInt8(height & 0xFF), UInt8((height >> 8) & 0xFF)])) // ϏοτϚοϓσʔλ command.append(data) return command } ελʔਫ਼ີϨγʔτϓϦϯλʔ༻ίϚϯυͷྫ ҹ͢ΔϨγʔτσʔλΛ࡞͢Δ -
// ϨγʔτΛΧοτʢஅʣ͢ΔίϚϯυ public func cutPaperCommand() -> Data { Data([0x1D,
0x56, 0x00]) } // ը૾Λҹ͢ΔͨΊͷίϚϯυ public func bitmapCommand(_ data: Data, width: Int, height: Int) -> Data { var command = Data() // ϏοτϚοϓҹίϚϯυ command.append(Data([0x1D, 0x76, 0x30, 0x00])) // ෯ͱߴ͞ command.append(Data([UInt8(width & 0xFF), UInt8((width >> 8) & 0xFF)])) command.append(Data([UInt8(height & 0xFF), UInt8((height >> 8) & 0xFF)])) // ϏοτϚοϓσʔλ command.append(data) return command } &QTPOϨγʔτϓϦϯλʔ༻ίϚϯυͷྫ ҹ͢ΔϨγʔτσʔλΛ࡞͢Δ -
// ϨγʔτΛΧοτʢஅʣ͢ΔίϚϯυ public func cutPaperCommand() -> Data { Data([0x1B,
0x64, 0x00]) } // ը૾Λҹ͢ΔͨΊͷίϚϯυ public func bitmapCommand(_ data: Data, width: Int, height: Int) -> Data { var command = Data() // ϏοτϚοϓҹίϚϯυ command.append(Data([0x1B, 0x58])) // ෯ͱߴ͞ command.append(Data([UInt8(width & 0xFF), UInt8((width >> 8) & 0xFF)])) command.append(Data([UInt8(height & 0xFF), UInt8((height >> 8) & 0xFF)])) // ϏοτϚοϓσʔλ command.append(data) return command } ελʔਫ਼ີϨγʔτϓϦϯλʔ༻ίϚϯυͷྫ ҹ͢ΔϨγʔτσʔλΛ࡞͢Δ -
// ϨγʔτΛΧοτʢஅʣ͢ΔίϚϯυ public func cutPaperCommand() -> Data { Data([0x1B,
0x64, 0x00]) } // ը૾Λҹ͢ΔͨΊͷίϚϯυ public func bitmapCommand(_ data: Data, width: Int, height: Int) -> Data { var command = Data() // ϏοτϚοϓҹίϚϯυ command.append(Data([0x1B, 0x58])) // ෯ͱߴ͞ command.append(Data([UInt8(width & 0xFF), UInt8((width >> 8) & 0xFF)])) command.append(Data([UInt8(height & 0xFF), UInt8((height >> 8) & 0xFF)])) // ϏοτϚοϓσʔλ command.append(data) return command } ελʔਫ਼ີϨγʔτϓϦϯλʔ༻ίϚϯυͷྫ ҹ͢ΔϨγʔτσʔλΛ࡞͢Δ %BUBܕΛฦ͢ -
ϨγʔτίϚϯυ%BUBܕ public func cutPaperCommand() -> Data { Data([0x1D, 0x56,
0x00]) } ϨγʔτϓϦϯλʔʹσʔλΛૹΔ -
ϨγʔτίϚϯυ%BUBܕ public func cutPaperCommand() -> Data { Data([0x1D, 0x56,
0x00]) } %BUBܕΛόΠτྻʹม extension Data { func toBytes() -> [UInt8] { withUnsafeBytes { (pointer: UnsafeRawBufferPointer) -> [UInt8] in let unsafeBufferPointer = pointer.bindMemory(to: UInt8.self) let unsafePointer = unsafeBufferPointer.baseAddress! return [UInt8](UnsafeBufferPointer(start: unsafePointer, count: count)) } } } ϨγʔτϓϦϯλʔʹσʔλΛૹΔ -
var bytes: [UInt8] = data.toByte() func write() { let
session: EASession let failedLimit: UInt = 10 var failedCount: UInt = 0 while let outputStream = session.outputStream, failedCount < failedLimit { let writtenBytes = outputStream.write(bytes, maxLength: bytes.count) if writtenBytes > 0 { let toRange = min(bytes.count, Int(writtenBytes)) bytes.removeSubrange(0 ..< toRange) } else { failedCount += 1 } } } ϨγʔτϓϦϯλʔʹσʔλΛૹΔ %BUBܕΛόΠτྻʹม͠0VUQVU4USFBNʹॻ͖ࠐΉ -
var bytes: [UInt8] = data.toByte() func write() { let
session: EASession let failedLimit: UInt = 10 var failedCount: UInt = 0 while let outputStream = session.outputStream, failedCount < failedLimit { let writtenBytes = outputStream.write(bytes, maxLength: bytes.count) if writtenBytes > 0 { let toRange = min(bytes.count, Int(writtenBytes)) bytes.removeSubrange(0 ..< toRange) } else { failedCount += 1 } } } ϨγʔτϓϦϯλʔʹσʔλΛૹΔ &"4FTTJPO͔Β 0VUQVU4USFBNΛநग़ %BUBܕΛόΠτྻʹม͠0VUQVU4USFBNʹॻ͖ࠐΉ -
var bytes: [UInt8] = data.toByte() func write() { let
session: EASession let failedLimit: UInt = 10 var failedCount: UInt = 0 while let outputStream = session.outputStream, failedCount < failedLimit { let writtenBytes = outputStream.write(bytes, maxLength: bytes.count) if writtenBytes > 0 { let toRange = min(bytes.count, Int(writtenBytes)) bytes.removeSubrange(0 ..< toRange) } else { failedCount += 1 } } } ϨγʔτϓϦϯλʔʹσʔλΛૹΔ σʔλʢίϚϯυʣΛ 0VUQVU4USFBNʹॻ͖ࠐΉ %BUBܕΛόΠτྻʹม͠0VUQVU4USFBNʹॻ͖ࠐΉ -
var bytes: [UInt8] = data.toByte() func write() { let
session: EASession let failedLimit: UInt = 10 var failedCount: UInt = 0 while let outputStream = session.outputStream, failedCount < failedLimit { let writtenBytes = outputStream.write(bytes, maxLength: bytes.count) if writtenBytes > 0 { let toRange = min(bytes.count, Int(writtenBytes)) bytes.removeSubrange(0 ..< toRange) } else { failedCount += 1 } } } ϨγʔτϓϦϯλʔʹσʔλΛૹΔ ॻ͖ࠐΜͩͷσʔλΛ CZUFT͔ΒऔΓআ͘ %BUBܕΛόΠτྻʹม͠0VUQVU4USFBNʹॻ͖ࠐΉ -
var bytes: [UInt8] = data.toByte() func write() { let
session: EASession let failedLimit: UInt = 10 var failedCount: UInt = 0 while let outputStream = session.outputStream, failedCount < failedLimit { let writtenBytes = outputStream.write(bytes, maxLength: bytes.count) if writtenBytes > 0 { let toRange = min(bytes.count, Int(writtenBytes)) bytes.removeSubrange(0 ..< toRange) } else { failedCount += 1 } } } ϨγʔτϓϦϯλʔʹσʔλΛૹΔ ॻ͖ࠐΈ͕ྃ͢Δ͔ ճࣦഊ͢Δ·Ͱϧʔϓ %BUBܕΛόΠτྻʹม͠0VUQVU4USFBNʹॻ͖ࠐΉ -
4USFBN"1*ͱ 4USFBN%FMFHBUF ɾΠϕϯτۦಈͰ4USFBNͷঢ়ଶΛࢹ ɾΠϕϯτ 4USFBN&WFOU ͷछྨ PQFO$PNQMFUFE 4USFBNΛ։࢝ͨ͠ IBT#ZUFT"WBJMBCMF
*OQVU4USFBNͰಡΈऔΓՄೳͳσʔλ͕౸ணͨ͠ IBT4QBDF"WBJMBCMF 0VUQVU4USFBNͷॻ͖ࠐΈ͕Մೳʹͳͬͨ FSSPS0DDVSSFE 4USFBNͷૢ࡞தʹΤϥʔ͕ൃੜͨ͠ FOE&ODPVOUFSFE 4USFBN͕ਖ਼ৗʹऴྃͨ͠ -
4USFBNͷ࣮ྫɿΫϥεશମ final class PrinterStream: NSObject, StreamDelegate { private let
session: EASession init(session: EASession) { self.session = session } func openStreams() { // OutputStreamઃఆ session.outputStream?.delegate = self session.outputStream?.schedule( in: .main, forMode: .common ) session.outputStream?.open() // InputStreamઃఆ session.inputStream?.delegate = self session.inputStream?.schedule( in: .main, forMode: .common ) session.inputStream?.open() } func closeStreams() { // OutputStreamऴྃ session.outputStream?.close() session.outputStream?.remove( from: .main, forMode: .common ) session.outputStream?.delegate = nil // InputStreamऴྃ session.inputStream?.close() session.inputStream?.remove( from: .main, forMode: .common ) session.inputStream?.delegate = nil } func stream(_ aStream: Stream, handle eventCode: Stream.Event) { switch aStream { case _ as OutputStream: // OutputStream ͷϋϯυϦϯά case _ as InputStream: // inputStream ͷϋϯυϦϯά default: break } } -
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ func
startSession() { guard let session = EASession( accessory: accessory, forProtocol: protocolString) else { return } … } -
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ func
startSession() { guard let session = EASession( accessory: accessory, forProtocol: protocolString) else { return } … } ֎෦ଓΞΫηαϦ ϨγʔτϓϦϯλʔ -
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ func
startSession() { guard let session = EASession( accessory: accessory, forProtocol: protocolString) else { return } … } ௨৴ϓϩτίϧจࣈྻ ɾ&QTPODPNFQTPOFTDQPT ɾελʔਫ਼ີKQTUBSNTUBSQSP -
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ private
let session: EASession func openStreams() { session.outputStream?.delegate = self session.outputStream?.schedule( in: .main, forMode: .common ) … -
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ private
let session: EASession func openStreams() { session.outputStream?.delegate = self session.outputStream?.schedule( in: .main, forMode: .common ) … 4USFBN%FMFHBUFͷઃఆ -
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ private
let session: EASession func openStreams() { session.outputStream?.delegate = self session.outputStream?.schedule( in: .main, forMode: .common ) … 3VO-PPQΛొ -
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ private
let session: EASession func openStreams() { session.outputStream?.delegate = self session.outputStream?.schedule( in: .main, forMode: .common ) … 3VO-PPQΛొ 4USFBNΛ ϝΠϯεϨουͰॲཧ -
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ private
let session: EASession func openStreams() { … session.outputStream?.open() } -
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ private
let session: EASession func openStreams() { … session.outputStream?.open() } 4USFBNͷ։࢝ -
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ final
class PrinterStream: …, StreamDelegate { … func stream(_ aStream: Stream, handle eventCode: Stream.Event) { … switch aStream { case _ as OutputStream: // OutputStream ͷϋϯυϦϯά default: break … -
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ final
class PrinterStream: …, StreamDelegate { … func stream(_ aStream: Stream, handle eventCode: Stream.Event) { … switch aStream { case _ as OutputStream: // OutputStream ͷϋϯυϦϯά default: break … 4USFBN&WFOU͕ ݺΕΔ PQFO$PNQMFUFE 4USFBNΛ։࢝ͨ͠ IBT#ZUFT"WBJMBCMF *OQVU4USFBNͰಡΈऔΓՄೳͳσʔλ͕౸ணͨ͠ IBT4QBDF"WBJMBCMF 0VUQVU4USFBNͷॻ͖ࠐΈ͕Մೳʹͳͬͨ FSSPS0DDVSSFE 4USFBNͷૢ࡞தʹΤϥʔ͕ൃੜͨ͠ FOE&ODPVOUFSFE 4USFBN͕ਖ਼ৗʹऴྃͨ͠ -
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ final
class PrinterStream: …, StreamDelegate { … func stream(_ aStream: Stream, handle eventCode: Stream.Event) { … switch aStream { case _ as OutputStream: // OutputStream ͷϋϯυϦϯά default: break … 4USFBNͷ ϋϯυϦϯάΛ࣮ࢪ PQFO$PNQMFUFE 4USFBNΛ։࢝ͨ͠ IBT#ZUFT"WBJMBCMF *OQVU4USFBNͰಡΈऔΓՄೳͳσʔλ͕౸ணͨ͠ IBT4QBDF"WBJMBCMF 0VUQVU4USFBNͷॻ͖ࠐΈ͕Մೳʹͳͬͨ FSSPS0DDVSSFE 4USFBNͷૢ࡞தʹΤϥʔ͕ൃੜͨ͠ FOE&ODPVOUFSFE 4USFBN͕ਖ਼ৗʹऴྃͨ͠ -
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ private
let session: EASession func closeStreams() { … session.outputStream?.close() session.outputStream?.remove( from: .main, forMode: .common ) session.outputStream?.delegate = nil } -
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ private
let session: EASession func closeStreams() { … session.outputStream?.close() session.outputStream?.remove( from: .main, forMode: .common ) session.outputStream?.delegate = nil } 4USFBNͷऴྃ -
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ private
let session: EASession func closeStreams() { … session.outputStream?.close() session.outputStream?.remove( from: .main, forMode: .common ) session.outputStream?.delegate = nil } $PO fi HVSBUJPOઃఆͷআ -
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ ϨγʔτϓϦϯλʔͱͷ
ηογϣϯ͕ܧଓ͍ͯ͠Ε ʙ܁Γฦ࣮͠ߦͰ͖Δ -
var bytes: [UInt8] = data.toByte() func write() { let session:
EASession let failedLimit: UInt = 10 var failedCount: UInt = 0 while let outputStream = session.outputStream, failedCount < failedLimit { let writtenBytes = outputStream.write(bytes, maxLength: bytes.count) if writtenBytes > 0 { let toRange = min(bytes.count, Int(writtenBytes)) bytes.removeSubrange(0 ..< toRange) } else { failedCount += 1 } } } ௐࠪΛͯ͠Θ͔ͬͨ͜ͱ ॻ͖ࠐΈΛϧʔϓͰॲཧ -
var bytes: [UInt8] = data.toByte() func write() { let session:
EASession let failedLimit: UInt = 10 var failedCount: UInt = 0 while let outputStream = session.outputStream, failedCount < failedLimit { let writtenBytes = outputStream.write(bytes, maxLength: bytes.count) if writtenBytes > 0 { let toRange = min(bytes.count, Int(writtenBytes)) bytes.removeSubrange(0 ..< toRange) } else { failedCount += 1 } } } ௐࠪΛͯ͠Θ͔ͬͨ͜ͱ ॻ͖ࠐΈ͕#ZUFͷͨΊࣦഊ -
var bytes: [UInt8] = data.toByte() func write() { let session:
EASession let failedLimit: UInt = 10 var failedCount: UInt = 0 while let outputStream = session.outputStream, failedCount < failedLimit { let writtenBytes = outputStream.write(bytes, maxLength: bytes.count) if writtenBytes > 0 { let toRange = min(bytes.count, Int(writtenBytes)) bytes.removeSubrange(0 ..< toRange) } else { failedCount += 1 } } } ௐࠪΛͯ͠Θ͔ͬͨ͜ͱ ճࣦഊͨͨ͠Ίϧʔϓऴྃ -
var bytes: [UInt8] = data.toByte() func write() { let session:
EASession let failedLimit: UInt = 10 var failedCount: UInt = 0 while let outputStream = session.outputStream, failedCount < failedLimit { let writtenBytes = outputStream.write(bytes, maxLength: bytes.count) if writtenBytes > 0 { let toRange = min(bytes.count, Int(writtenBytes)) bytes.removeSubrange(0 ..< toRange) } else { failedCount += 1 } } } ௐࠪΛͯ͠Θ͔ͬͨ͜ͱ ճࣦഊͨͨ͠Ίϧʔϓऴྃ ॻ͖ࠐΈʹࣦഊ͠ଓ͚ͯ ϧʔϓ͕ऴྃ͠ ์ஔঢ়ଶʹͳ͍ͬͯͨ -
var bytes: [UInt8] = data.toByte() func write() { let session:
EASession let failedLimit: UInt = 10 var failedCount: UInt = 0 while let outputStream = session.outputStream, failedCount < failedLimit { let writtenBytes = outputStream.write(bytes, maxLength: bytes.count) if writtenBytes > 0 { let toRange = min(bytes.count, Int(writtenBytes)) bytes.removeSubrange(0 ..< toRange) } else { failedCount += 1 } } } ͪͳΈʹҹ͕ఀࢭ͢Δͱʜ ॻ͖ࠐΈͨ͠ΛCZUFT͔Βআ -
var bytes: [UInt8] = data.toByte() func write() { let session:
EASession let failedLimit: UInt = 10 var failedCount: UInt = 0 while let outputStream = session.outputStream, failedCount < failedLimit { let writtenBytes = outputStream.write(bytes, maxLength: bytes.count) if writtenBytes > 0 { let toRange = min(bytes.count, Int(writtenBytes)) bytes.removeSubrange(0 ..< toRange) } else { failedCount += 1 } } } ͪͳΈʹҹ͕ఀࢭ͢Δͱʜ ϧʔϓऴ͕ྃͨ͠σʔλଘ -
ϨγʔτҹͷσʔλྔΛϩάͰ֬ೝ Ϩγʔτσʔλ૯ྔɹɹ #ZUF ճͷॻ͖ࠐΈ #ZUF ʙճͷॻ͖ࠐΈ
#ZUF ճͷॻ͖ࠐΈ #ZUF ճҎ߱ͷॻ͖ࠐΈ #ZUF Γͷσʔλྔ #ZUF &QTPO5.Nͷ߹ -
ϨγʔτҹͷσʔλྔΛϩάͰ֬ೝ Ϩγʔτσʔλ૯ྔɹɹ #ZUF ճͷॻ͖ࠐΈ #ZUF ʙճͷॻ͖ࠐΈ
#ZUF ճͷॻ͖ࠐΈ #ZUF ճҎ߱ͷॻ͖ࠐΈ #ZUF Γͷσʔλྔ #ZUF &QTPO5.Nͷ߹ ɾճ ճͰॻ͖ࠐΈ༗ ɾॻ͖ࠐΈࣦഊཱ͕ͭ ɾ͕ॻ͖ࠐΈͰ͖ͣ -
Ϩγʔτσʔλͷॻ͖ࠐΈ͕ਐ·ͳ͍ݪҼ ɾॻ͖ࠐΉσʔλྔͷཧతͳ੍ݶɿ #ZUF CJU ͷʣ ɾճͷ #ZUFͷॻ͖ࠐΈͰ੍ݶʹ౸ୡͯ͠͠·ͬͨ ɾ੍ݶʹ౸ୡ͢ΔओͳཁҼ ɾ&"4FTTJPOͷ0VUQVU4USFBNόοϑΝαΠζ੍ݶ
ɾϓϦϯλʔϋʔυΣΞଆͷड৴όοϑΝ੍ݶ ɾ#MVFUPPUI௨৴ϓϩτίϧͷ੍ݶ -
Ϩγʔτσʔλͷॻ͖ࠐΈ͕ਐ·ͳ͍ݪҼ Ϩγʔτσʔλ૯ྔɹɹ #ZUF ճͷॻ͖ࠐΈ #ZUF ʙճͷॻ͖ࠐΈ
#ZUF ճͷॻ͖ࠐΈ #ZUF ճҎ߱ͷॻ͖ࠐΈ #ZUF Γͷσʔλྔ #ZUF -
Ϩγʔτσʔλͷॻ͖ࠐΈ͕ਐ·ͳ͍ݪҼ Ϩγʔτσʔλ૯ྔɹɹ #ZUF ճͷॻ͖ࠐΈ #ZUF ʙճͷॻ͖ࠐΈ
#ZUF ճͷॻ͖ࠐΈ #ZUF ճҎ߱ͷॻ͖ࠐΈ #ZUF Γͷσʔλྔ #ZUF 🤔 -
Ϩγʔτσʔλͷॻ͖ࠐΈ͕ਐ·ͳ͍ݪҼ ɾճɹɿ #ZUFॻ͖ࠐΈʢຬഋʣ ɾʙճɿຬഋͷͨΊॻ͖ࠐΈෆՄ ɾճɹɹϓϦϯλʔ͕Ұ෦σʔλΛҹ ɹɹɹɹɹɹۭ͖͕ൃੜ͠ #ZUFॻ͖ࠐΈ ɾճʙɹ ϓϦϯλʔҹ͕σʔλॲཧʹ͍͔ͭͳ͍
ಉظతͳϙʔϦϯά XIJMFจ Ͱ 0VUQVU4USFBNͷۭ͖Λదʹݕग़Ͱ͖ͳ͍ 0VUQVU4USFBN -
Ϩγʔτσʔλͷॻ͖ࠐΈ͕ਐ·ͳ͍ݪҼ ɾճɹɿ #ZUFॻ͖ࠐΈʢຬഋʣ ɾʙճɿຬഋͷͨΊॻ͖ࠐΈෆՄ ɾճɹɹϓϦϯλʔ͕Ұ෦σʔλΛҹ ɹɹɹɹɹɹۭ͖͕ൃੜ͠ #ZUFॻ͖ࠐΈ ɾճʙɹ ϓϦϯλʔҹ͕σʔλॲཧʹ͍͔ͭͳ͍
ಉظతͳϙʔϦϯά XIJMFจ Ͱ 0VUQVU4USFBNͷۭ͖Λదʹݕग़Ͱ͖ͳ͍ 0VUQVU4USFBN -
var bytes: [UInt8] = data.toByte() func write() { let
session: EASession let failedLimit: UInt = 10 var failedCount: UInt = 0 while let outputStream = session.outputStream, failedCount < failedLimit { let writtenBytes = outputStream.write(bytes, maxLength: bytes.count) if writtenBytes > 0 { let toRange = min(bytes.count, Int(writtenBytes)) bytes.removeSubrange(0 ..< toRange) } else { failedCount += 1 } } } 0VUQVU4USFBNͷۭ͖Λݕग़Ͱ͖ͳ͍ཧ༝ ʢ࠶ܝʣ%BUBܕΛ6*OUܕྻʹม͠Ҿʹ͢ -
var bytes: [UInt8] = data.toByte() func write() { let
session: EASession let failedLimit: UInt = 10 var failedCount: UInt = 0 while let outputStream = session.outputStream, failedCount < failedLimit { let writtenBytes = outputStream.write(bytes, maxLength: bytes.count) if writtenBytes > 0 { let toRange = min(bytes.count, Int(writtenBytes)) bytes.removeSubrange(0 ..< toRange) } else { failedCount += 1 } } } 0VUQVU4USFBNͷۭ͖Λݕग़Ͱ͖ͳ͍ཧ༝ ʢ࠶ܝʣ%BUBܕΛ6*OUܕྻʹม͠Ҿʹ͢ -
var bytes: [UInt8] = data.toByte() func write() { let
session: EASession let failedLimit: UInt = 10 var failedCount: UInt = 0 while let outputStream = session.outputStream, failedCount < failedLimit { let writtenBytes = outputStream.write(bytes, maxLength: bytes.count) if writtenBytes > 0 { let toRange = min(bytes.count, Int(writtenBytes)) bytes.removeSubrange(0 ..< toRange) } else { failedCount += 1 } } } Ϩγʔτσʔλͷॻ͖ࠐΈ͕ਐ·ͳ͍ݪҼ ʢ࠶ܝʣ%BUBܕΛ6*OUܕྻʹม͠Ҿʹ͢ ɾಉظతͳϧʔϓॲཧͰ0VUQVU4USFBNΛϙʔϦϯά ɾ0VUQVU4USFBNͷঢ়ଶมԽΛϦΞϧλΠϜͰࢹͰ͖ͳ͍ʂ ɾϓϦϯλʔͷॲཧͱΞϓϦؒͰಉظ͕औΕͳ͍ -
var bytes: [UInt8] = data.toByte() func write() { let
session: EASession let failedLimit: UInt = 10 var failedCount: UInt = 0 while let outputStream = session.outputStream, failedCount < failedLimit { let writtenBytes = outputStream.write(bytes, maxLength: bytes.count) if writtenBytes > 0 { let toRange = min(bytes.count, Int(writtenBytes)) bytes.removeSubrange(0 ..< toRange) } else { failedCount += 1 } } } Ϩγʔτσʔλͷॻ͖ࠐΈ͕ਐ·ͳ͍ݪҼ ʢ࠶ܝʣ%BUBܕΛ6*OUܕྻʹม͠Ҿʹ͢ ɾಉظతͳϧʔϓॲཧͰ0VUQVU4USFBNΛϙʔϦϯάʜ ɾ0VUQVU4USFBNͷঢ়ଶมԽΛϦΞϧλΠϜͰࢹͰ͖ͳ͍ʂ ɾϓϦϯλʔͷॲཧͱಉظ͕औΕͳ͍ 0VUQVU4USFBNͷ ঢ়ଶมԽΛࢹ͢Δ Έ͕ඞཁʂ -
var bytes: [UInt8] = data.toByte() func write() { let
session: EASession let failedLimit: UInt = 10 var failedCount: UInt = 0 while let outputStream = session.outputStream, failedCount < failedLimit { let writtenBytes = outputStream.write(bytes, maxLength: bytes.count) if writtenBytes > 0 { let toRange = min(bytes.count, Int(writtenBytes)) bytes.removeSubrange(0 ..< toRange) } else { failedCount += 1 } } } Ϩγʔτσʔλͷॻ͖ࠐΈ͕ਐ·ͳ͍ݪҼ ʢ࠶ܝʣ%BUBܕΛ6*OUܕྻʹม͠Ҿʹ͢ ɾಉظతͳϧʔϓॲཧͰ0VUQVU4USFBNΛϙʔϦϯάʜ ɾ0VUQVU4USFBNͷঢ়ଶมԽΛϦΞϧλΠϜͰࢹͰ͖ͳ͍ʂ ɾϓϦϯλʔͷॲཧͱಉظ͕औΕͳ͍ 4USFBN&WFOUͷग़൪ʂ -
0VUQVU4USFBNͷঢ়ଶมԽΛࢹ͢Δղܾࡦ final class PrinterStream: …, StreamDelegate { … func
stream(_ aStream: Stream, handle eventCode: Stream.Event) { … switch aStream { case _ as OutputStream: // OutputStream ͷϋϯυϦϯά default: break } } -
0VUQVU4USFBNͷঢ়ଶมԽΛࢹ͢Δղܾࡦ final class PrinterStream: …, StreamDelegate { … func
stream(_ aStream: Stream, handle eventCode: Stream.Event) { … switch aStream { case _ as OutputStream: switch eventCode { case .hasSpaceAvailable: // OutputStreamͷॻ͖ࠐΈΛ࠶։ write() } default: break } -
0VUQVU4USFBNͷঢ়ଶมԽΛࢹ͢Δղܾࡦ final class PrinterStream: …, StreamDelegate { … func
stream(_ aStream: Stream, handle eventCode: Stream.Event) { … switch aStream { case _ as OutputStream: switch eventCode { case .hasSpaceAvailable: // OutputStreamͷॻ͖ࠐΈΛ࠶։ write() } default: break } 0VUQVU4USFBNͷ ॻ͖ࠐΈ͕Մೳʹͳͬͨ -
0VUQVU4USFBNͷঢ়ଶมԽΛࢹ͢Δղܾࡦ final class PrinterStream: …, StreamDelegate { … func
stream(_ aStream: Stream, handle eventCode: Stream.Event) { … switch aStream { case _ as OutputStream: switch eventCode { case .hasSpaceAvailable: // OutputStreamͷॻ͖ࠐΈΛ࠶։ write() } default: break }