20210623のSwiftに関する記事は8件です。

Mockoloをmintで使っているときに遭遇するエラー

Mockoloをmintで実装する際に、 Fatal error: The operation couldn’t be completed. (SwiftSyntax.ParserError error 1.) というエラーに遭遇する。 これは、Xcodeとmockoloのバージョンがあっていないので、 公式のリリースノート からバージョンを確認し、 mint install uber/mockolo@1.4.0 のようにバージョンを指定してインストールする。 Mintfileでバージョンを指定すれば完了。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[エラー]Command failed due to signal: Abort trap: 6

 エラーの内容 Command failed due to signal: Abort trap: 6 エラー原因 エラーは解決しましたが、なぜ発生したのかよくわかりません。 知ってる方がいらっしゃったら教えていただきたいです。 エラー解決方法 参考文献 エラー解決方法 Build Settings -> Swift Compiler - Code Generation -> Optimization LevelをOptimize for Speed[-O]に設定したら解決しました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SwiftからPOSIXコマンドを呼び出す

概要 下記のSwiftへの焼き直しを行う POSIXコマンドをObjective-Cで使用しようと試行錯誤した。 - Qiita NSTask(Objective-C)とPipe(Swift)は同一で良いみたい https://developer.apple.com/documentation/foundation/process 参考 terminationStatus [Swift] Processを使おう!(1) [Swift] Swiftで簡単なCLIを作ってみる (その3) | DevelopersIO 実装 呼び出し元クラス エラー有無と出力文字列の両方が欲しいので、返り値にResult<Success, Failure>を使用する import Foundation enum ExecutingCommandError: Error { case errorStatus(status: Int32, commandResult: CommandResult) } struct CommandResult { let command: String let standardOutputMessage: String? let standardErrorMessage: String? var description: String { var message = "【Command】\n" + "\(command)\n" if let standardOutputMessage = standardOutputMessage, !standardOutputMessage.isEmpty { message += "(Standard Output)\n" + standardOutputMessage } if let standardErrorMessage = standardErrorMessage, !standardErrorMessage.isEmpty { message += "(Standard Error)\n" + standardErrorMessage } return message } } func executeCommand(command: String, currentDirectoryURL: URL?) -> Result<CommandResult, ExecutingCommandError> { let process = Process() process.launchPath = "/bin/bash" // ワイルドカードを展開するためbashを経由する process.arguments = ["-c", command] let outputPipe = Pipe() let errorPipe = Pipe() process.standardOutput = outputPipe process.standardError = errorPipe process.currentDirectoryURL = currentDirectoryURL process.launch() process.waitUntilExit() while process.isRunning { Thread.sleep(forTimeInterval: 1.0) } let outputMessage = String(data: outputPipe.fileHandleForReading.readDataToEndOfFile(), encoding: .utf8) let errorMessage = String(data: errorPipe.fileHandleForReading.readDataToEndOfFile(), encoding: .utf8) let commandResult = CommandResult(command: command, standardOutputMessage: outputMessage, standardErrorMessage: errorMessage) let status = process.terminationStatus if status == 0 { return .success(commandResult) } else { return .failure(.errorStatus(status: status, commandResult: commandResult)) } } 呼び出し例 let result = executeCommand(command: "ls -la", currentDirectoryURL: Bundle.main.bundleURL) switch result { case .success(let commandResult): print(commandResult.description) case .failure(let error): switch error { case .errorStatus(status: _, commandResult: let commandResult): print(commandResult.description) } } 実行結果は以下の通り 【Command】 ls -la (Standard Output) total 0 drwxr-xr-x 3 xxxxx staff 96 Jun 17 14:10 . drwxr-xr-x@ 8 xxxxx staff 256 Jun 23 17:21 .. drwxr-xr-x 7 xxxxx staff 224 Jun 17 14:10 Contents
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Swift SDKを使って写真をNCMBへアップロードする

ニフクラ mobile backendでは各種言語向けにSDKを提供しています。その中で最も新しいSwift SDKについて、その使い方を紹介します。 今回はファイルストア(バイナリファイルのストレージ機能)を使って、撮影した写真をアップロードします。 イントロダクション (Swift) : クイックスタート | ニフクラ mobile backend 謝辞 この記事を書くにあたって、写真を撮影またはライブラリから取得する部分のコードを【SwiftUI】カメラ機能の実装方法【撮影画像とライブラリー画像の利用】から拝借しています。ありがとうございます。 import SwiftUI struct Imagepicker : UIViewControllerRepresentable { @Binding var show:Bool @Binding var image:Data var sourceType:UIImagePickerController.SourceType func makeCoordinator() -> Imagepicker.Coodinator { return Imagepicker.Coordinator(parent: self) } func makeUIViewController(context: UIViewControllerRepresentableContext<Imagepicker>) -> UIImagePickerController { let controller = UIImagePickerController() controller.sourceType = sourceType controller.delegate = context.coordinator return controller } func updateUIViewController(_ uiViewController: UIImagePickerController, context: UIViewControllerRepresentableContext<Imagepicker>) { } class Coodinator: NSObject,UIImagePickerControllerDelegate,UINavigationControllerDelegate { var parent : Imagepicker init(parent : Imagepicker){ self.parent = parent } func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { self.parent.show.toggle() } func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { let image = info[.originalImage] as! UIImage let data = image.jpegData(compressionQuality: 0.8) self.parent.image = data! self.parent.show.toggle() } } } Swift SDKの導入法 Swift SDKはCocoaPods向けに提供しています。Xcodeで新しいiOSプロジェクトを作ったら、Podfileを用意します。 # Uncomment the next line to define a global platform for your project # platform :ios, '9.0' target 'todoapp' do # Comment the next line if you don't want to use dynamic frameworks use_frameworks! # Pods for todoapp pod 'NCMB', :git => 'https://github.com/NIFCLOUD-mbaas/ncmb_swift.git' end そして pod install でSwift SDKをインストールします。 初期化について 現在、新規でiOSアプリを作成すると、InterfaceがSwiftUI、Life CycleがSwiftUI Appとなっています。この状態で作ると AppDelegate.swift はなく、 (アプリ名)App.swift というファイルが作られます。 この場合、まずSwift SDKを読み込みます。 import SwiftUI import NCMB // 追加 そして var body の上に @Environment を追加します。 @Environment(\.scenePhase) private var scenePhase // 追加 var body: some Scene { 最後に WindowGroup に onChange を追加します。このonChangeの中で初期化処理を行います。 WindowGroup { ContentView() } .onChange(of: scenePhase) { scene in switch scene { case .active: NCMB.initialize(applicationKey: "YOUR_APPLICATION_KEY", clientKey: "YOUR_CLIENT_KEY") case .background: print("background") case .inactive: print("inactive") @unknown default: print("default") } } これで利用可能になります。 必要なステートを準備 まず写真データを扱うために必要なステートを準備します。 struct ContentView: View { // 画像データが入ります @State var imageData : Data = .init(capacity:0) // フォトライブラリまたはカメラの指定が入ります @State var source:UIImagePickerController.SourceType = .photoLibrary // イメージピッカーの表示/非表示を切り替えます @State var isImagePicker = false // アップロード状態を管理します @State var uploaded = false // : 略 } 表示内容の作成 次に表示内容を作ります。イメージピッカー部分も合わせて記載しています。 // 表示 var body: some View { NavigationView{ VStack(spacing:0){ ZStack{ // イメージピッカーの表示/非表示用 NavigationLink( destination: Imagepicker(show: $isImagePicker, image: $imageData, sourceType: source), isActive:$isImagePicker, label: { Text("") }) VStack{ // イメージデータの有無で表示路切り替え if imageData.count != 0{ // イメージデータがある場合 // 画像を表示 Image(uiImage: UIImage(data: self.imageData)!) .resizable() .aspectRatio(contentMode: .fill) .frame(height: 250) .cornerRadius(15) .padding() // アップロード用ボタンの表示 Button(action: { // 後述 }, label: { Text("アップロード") }) .alert(isPresented: $uploaded, content: { // アップロード完了したらアラート Alert(title: Text("アップロード完了"), message: Text("写真をアップロードしました"), dismissButton: .default(Text("閉じる"))) }) } // 写真撮影またはフォトライブラリを開くボタン HStack(spacing:30){ // フォトライブラリを開く Button(action: { self.source = .photoLibrary self.isImagePicker.toggle() }, label: { Text("フォトライブラリ") }) // カメラを開く Button(action: { self.source = .camera self.isImagePicker.toggle() }, label: { Text("写真を撮影") }) } } } } .navigationBarTitle("Home", displayMode: .inline) } .ignoresSafeArea(.all, edges: .top) .background(Color.primary.opacity(0.06).ignoresSafeArea(.all, edges: .all)) } ファイルのアップロード処理 ではファイルストアへのアップロード処理を解説します。これは アップロード をタップした際に実行します。今回は写真の名前は photo.jpg で固定ですが、好きなものを指定してください。 // アップロード用ボタンの表示 Button(action: { // NCMBFileを作成 let file : NCMBFile = NCMBFile(fileName: "photo.jpg") // 保存処理の実行 file.saveInBackground(data: self.imageData, callback: { result in // 処理結果の判定 switch result { case .success: // 処理がうまくいっていれば、フラグを立てる self.uploaded = true case let .failure(error): // 失敗した場合 print("保存に失敗しました: \(error)") return; } }) }, label: { Text("アップロード") }) .alert(isPresented: $uploaded, content: { // アップロード完了したらアラート Alert(title: Text("アップロード完了"), message: Text("写真をアップロードしました"), dismissButton: .default(Text("閉じる"))) }) 画像データはNCMBFileのdataに対して、そのまま適用できます。処理は saveInBackground で非同期に処理されますので、結果を受け取ってからステートのフラグを立てることで alert イベントを実行しています。 コードの全体像は次のようになります。 import SwiftUI import NCMB struct ContentView: View { // 画像データが入ります @State var imageData : Data = .init(capacity:0) // フォトライブラリまたはカメラの指定が入ります @State var source:UIImagePickerController.SourceType = .photoLibrary // イメージピッカーの表示/非表示を切り替えます @State var isImagePicker = false // アップロード状態を管理します @State var uploaded = false // 表示 var body: some View { NavigationView{ VStack(spacing:0){ ZStack{ // イメージピッカーの表示/非表示用 NavigationLink( destination: Imagepicker(show: $isImagePicker, image: $imageData, sourceType: source), isActive:$isImagePicker, label: { Text("") }) VStack{ // イメージデータの有無で表示路切り替え if imageData.count != 0{ // イメージデータがある場合 // 画像を表示 Image(uiImage: UIImage(data: self.imageData)!) .resizable() .aspectRatio(contentMode: .fill) .frame(height: 250) .cornerRadius(15) .padding() // アップロード用ボタンの表示 Button(action: { // NCMBFileを作成 let file : NCMBFile = NCMBFile(fileName: "photo.jpg") // 保存処理の実行 file.saveInBackground(data: self.imageData, callback: { result in // 処理結果の判定 switch result { case .success: // 処理がうまくいっていれば、フラグを立てる self.uploaded = true case let .failure(error): // 失敗した場合 print("保存に失敗しました: \(error)") return; } }) }, label: { Text("アップロード") }) .alert(isPresented: $uploaded, content: { // アップロード完了したらアラート Alert(title: Text("アップロード完了"), message: Text("写真をアップロードしました"), dismissButton: .default(Text("閉じる"))) }) } // 写真撮影またはフォトライブラリを開くボタン HStack(spacing:30){ // フォトライブラリを開く Button(action: { self.source = .photoLibrary self.isImagePicker.toggle() }, label: { Text("フォトライブラリ") }) // カメラを開く Button(action: { self.source = .camera self.isImagePicker.toggle() }, label: { Text("写真を撮影") }) } } } } .navigationBarTitle("Home", displayMode: .inline) } .ignoresSafeArea(.all, edges: .top) .background(Color.primary.opacity(0.06).ignoresSafeArea(.all, edges: .all)) } } まとめ 写真アプリなど、写真データをクラウドにアップロードしたいという機会は多いかと思います。そうした時にサーバを用意せずに使えるNCMBは、アプリ開発を高速化してくれる良い手段になるはずです。ぜひお使いください! mBaaSでサーバー開発不要! | ニフクラ mobile backend
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Swift でシステムサウンド再生モジュールを作る

はじめに カメラアプリを作っていると、システムサウンドを鳴らしたいときが来ます 録画開始終了時のピコンとポロンを鳴らしたいのです 先駆者様のおかげで実装できたので、モジュール化したものを記載しておきます 先駆者様 SystemSound を enum にしておく 1117 とかいう数字を使用時に丸出しにしたくないので、使う SystemSoundID を Enum にしておく import AVFoundation enum SystemSound: UInt32 { case beginVideoRecording = 1117 case endVideoRecording = 1118 var systemSoundID: SystemSoundID { self.rawValue as SystemSoundID } } システムサウンドの一覧はこちら どんな音か聞いて確かめたいときは、こちらのアプリが非常に便利です SystemSoundPlayer を作る あちこちで使えるように .play で再生できる Player を作っておきます import AVFoundation import Foundation public class SystemSoundPlayer { func play(systemSoundID: UInt32) { var soundIdRing: SystemSoundID = systemSoundID if let soundUrl = CFBundleCopyResourceURL(CFBundleGetMainBundle(), nil, nil, nil) { AudioServicesCreateSystemSoundID(soundUrl, &soundIdRing) AudioServicesPlaySystemSound(soundIdRing) } } func play(systemSound: SystemSound) { self.play(systemSoundID: systemSound.systemSoundID) } } SystemSoundPlayer を使う SystemSound を enum にしておいたおかけで、使用時には XCode が補完してくれる let systemSoundPlayer = SystemSoundPlayer() systemSoundPlayer.play(systemSound: .beginVideoRecording) まとめ これで簡単に、それっぽくシステムサウンドが再生できます
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Swift5でgetterとsetter(計算型プロパティ)についてまとめた

はじめに こんにちは@kaneko77です。 getterとsetterについてたまにわかりずらいなと思ってしまう時があった為 調べ直したものをまとめたいと思います。 getterとsetterについて この二つを説明するにあたって計算型プロパティという物を説明する必要があります。 計算型プロパティとは 値の参照と更新の機能を手続きで構成するプロパティになります。 そして計算型プロパティにはget節とset節というものがありそちらが今回のgetterとsetterになるということです。 get節がgetterでset節がsetterです。 計算型プロパティは、値の更新と参照ができるパターンと参照だけできるパターンがの2種類があるということも知って置いてください。 結局のところ、参照した結果の値を計算するのがget節で、指定された値を使ってプロパティを表す値を更新する部分がset節になるということです。 上記のまとめ get節: 参照した結果の値を計算する set節: 指定された値を使ってプロパティを表す値を更新する getter: どういう風に値を取得するのか setter: 値を代入した場合の動き get節のみの定義でもできる 説明 基本 以下が計算型プロパティのゲッタとセッタを基本の形でコードを現した物になります。。 var プロパティ名: 型 { get{ .... } set(仮引数){ .... } } 仮引数の省略 仮引数は省略可能でその場合は値の取得はnewValueという変数が使えます。 var プロパティ名: 型 { get{ .... } set{ return newValue } } returnの省略 関数と同じなのでreturnは省略できます。 var プロパティ名: 型 { get{ .... } set{ newValue } } setの省略 プロパティの値を参照するときだけの場合はsetが必要ない為、省略できます。 var プロパティ名: 型 { get{ .... } } getのみの場合さらに省略することができます。 以下もゲッタを使ってるのと同じです。 get自体を省略できます。 var プロパティ名: 型 { .... } 具体的な利用シーン それでは書き方として色んな書き方や概念がわかってきたと思うので続いて じゃー具体的にどういう時に使われるのかというお話になります。 以下がよく使われる例 税込み価格・税抜き価格取得したい時 入力文字を全部大文字にしたい時 etc.. それでは上記二つを例としてコードで書いてみます。 税込み価格・税抜き価格取得したい時 今は税金10%の時代なので1.10でやります。 var price: Double = 100 var tax: Double { get{ price * 1.10 } set{ price = newValue / 1.10 } } price = 1000 // 税込み価格を取得 print(tax) // 1100.0 tax = 1100 // 税抜き価格を取得 print(price) // 999 入力文字を全部大文字にしたい時 var inputValue = "test" var uppercaseValue: String { get { inputValue } set { inputValue = newValue.uppercased() } } uppercaseValue = "hogehoge" print(uppercaseValue) // HOGEHOGE 終わりに 今回はgetterとsetterについて共有しました。 プロパティのメリットは外部から参照した時に意図しない変更を加えられなくするところだと思います。 getterは対象の値を書き換えたくない時などに使えると思います。 setterは何か付け加えた時、例えば名前の先頭文字に全部mr.とかつけたいなど要は値の加工ですねに使えると思います。 慣れれば割といろんなところに使えると思います。 ここまで読んでいただきありがとうございます。 参考にしたサイト https://qiita.com/nack43/items/5e1d7972ed0b54daeb04 https://www.hfoasi8fje3.work/entry/2018/05/07/002215
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ダークモード対応時に色の命名規則を決めてみた

私はRadiotalkというラジオ配信サービスのアプリ開発インターンをしています。 本記事では、iOSダークモード対応をする際に、Colorの命名規則を決めたことについてご紹介します。 今回決めた命名規則は課題も残っているため、参考程度に目を通していただければと思います。 ダークモードとは何か 公式ドキュメントを基に説明します。 Dark Mode - Visual Design - iOS - Human Interface Guidelines - Apple Developer ダークモードとは、黒を基調とした画面モードのことです。 ユーザーはダークモードに設定することで、システム全体の外観を黒基調の配色に切り替えることができます。 ダークモードに切り替えることで、ユーザがよりコンテンツに集中しやすくなるという利点があります。 従来のRadiotalkの色の規則 Radiotalkで使用する色について Natural colors 現在、Radiotalkで定義されている色(Natural colors)は以下の通りです。 さらに、上記の緑枠で囲まれているBase colorやAccent colorが存在します。 Base color Radiotalkのベース色 例)背景→Navy、テキスト→White Accent color 全体的に少ない使用量で、強調させる色 例)Yellow、Orange、Red Surface color Natural colorsとは別にSurface Colorがあり、以下の意味を持ちます。 数字は白の透明度を表す割合 他のコンポーネントに重ねて使用 階層 Radiotalkでは、色の明度差を階層と呼んでいます。 背景やテキストなどに、階層が存在します。 例を挙げると、背景はRadio_Navyの3つの階層を使用します。 ダークモード対応時に発生しうる課題 従来では、以下のような命名規則でした。 Radiotalk + [ 色の名前 ] RadiotalkNavy RadiotalkOrange RadiotalkYellow RadiotalkNavyWhite このような色の定義でダークモード対応を行った場合、次のことが起こります。 ①②のような色をベースとした命名規則では、以下の課題が発生します。 色の理解がしづらく、名前だけで判断できない 新しく色を追加しづらい ダークモードの色の考慮が必要 解決策 従来の命名規則では、色の名前のみを定義していたため、上記の課題が発生しました。 そこで、色の整理を行い、以下の流れで命名規則の検討を行いました。 これらを踏まえて、以下の命名規則にしました。 [ コンポーネント名 ] + [ 色の名前 ] + Color 背景,ボタンなど各コンポーネントに使用する色として定義 ベースカラーは色の名前を省略 階層が存在する場合、Primary、Secondary、Tertiaryを[ 色の名前 ]の前に追加 [ 汎用名 ] + [ 色の名前 ] + Color AccentやErrorは少ない使用量で、強調させるコンポーネントに使用する色 Surfaceは白の透明度を表す 例)Surface5の場合、白の透明度5% [ 汎用名 ]を追加する理由は、1つの色に対してボタンやCellなどの小エリアといった複数のコンポーネントに使用する場合があるからです。 全てのコンポーネントに名前をつけて色の定義する必要がありません。 [ 色の名前 ]の補足 名前が区別しやすくなり、名前の冗長化を防ぐといった利点から、以下の条件を加えました。 コンポーネントに対して、1色のみ使用 → 色の名前を省略 例) ActiveButtonの場合、Surface colorの40%の1色 - ActiveButtonColor コンポーネントに対して、2色以上使用 → 色の名前 例) Iconの場合、WhiteとNavyの2色 - IconWhiteColor - IconNavyColor 実際に当てはめてみた 次に、以下のRadiotalkのトーク詳細画面を用いて説明します。 [ コンポーネント名 ] + [ 色の名前 ] + Color TextPrimaryColor ベースとなるテキスト用の色です。 階層が一つ下のテキストの場合はTextSecondaryColorです。 命名規則に当てはめると以下の通りです。 - [ コンポーネント名 ] → Text - [ 色の名前 ] + Color → ([ 色の名前 ]は省略) PrimaryColor BackgroundPrimaryColor ベースとなる背景色です。 階層によって、SecondaryやTertiaryも使用します。 命名規則に当てはめると以下の通りです。 - [ コンポーネント名 ] → Background - [ 色の名前 ] + Color → ([ 色の名前 ]は省略) PrimaryColor ActiveButtonColor フォロー中のボタンの色です。 命名規則に当てはめると以下の通りです。 - [ コンポーネント名 ] → ActiveButton - [ 色の名前 ] + Color → ([ 色の名前 ]は省略) Color IconWhiteColor 白いアイコン用の色です。 命名規則に当てはめると以下の通りです。 - [ コンポーネント名 ] → Icon - [ 色の名前 ] + Color → WhiteColor [ 汎用名 ] + [ 色の名前 ] + Color AccentYellowColor 強調させるコンポーネントに使用する色です。 ボタンやスライダーなどの小エリアに使用します。 命名規則に当てはめると以下の通りです。 - [ 汎用名 ] → Accent - [ 色の名前 ] + Color → YellowColor Surface12Color 白の透明度12%の色です。 命名規則に当てはめると以下の通りです。 - [ 汎用名 ] → Surface12 - [ 色の名前 ] + Color → ([ 色の名前 ]は省略) Color ダークモード対応後 解消前 以下①②のように色の名前のみで定義した規則でした。 解消後 上記により、同じNavyであってもどこに使う色かという情報が明確になりました。 さらに、別のNavyが追加されても規則に沿って追加しやすくなりました。 実装の具体例 トーク詳細画面をダークモード対応した結果が以下の通りです。 まとめ 本記事では、ダークモード対応をする際に、コンポーネントベースな色の命名規則で対応する過程をご紹介しました。 ダークモードに取り掛かる予定の方、もしくは、命名規則の考え方において少しでも参考になれば幸いです。 また、Radiotalkは1タップで簡単にラジオ収録することができるサービスです。 ぜひ、ダウンロードしてみてください! https://radiotalk.jp/
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Swiftの高階関数をまとめた

はじめに こんにちは@kaneko77です。 今回はSwiftの高階関数についてまとめてみました。 配列の操作でよく使うのでswiftのエンジニアは絶対覚えといて損はないものだと思います。 こちらを参考にしました。 目次 map flatMap compactMap filter reduce 紹介 map 配列のデータを一つ一つ引っ張る時に使います。 let test = ["マチュピチュ", "モンサンミッシェル", "サグラダファミリア", "アンコールワット"] test.map{ print("データ取得", $0) } ログ データ取得 マチュピチュ データ取得 モンサンミッシェル データ取得 サグラダファミリア データ取得 アンコールワット flatMap 多重配列を結合する時に使います。 let array = [ ["hoge1", "hoge2","hoge3"], ["huga1", "huga2"] ] let result = array.flatMap { $0 } print(result) ログ ["hoge1", "hoge2", "hoge3", "huga1", "huga2"] compactMap 配列のデータをキャストする時に使う let array = ["1", "2", "3", "4", "5"] let result = array.compactMap{ Int($0) } print("Stringの配列:", array) print("Intの配列:", result) ログ Stringの配列: ["1", "2", "3", "4", "5"] Intの配列: [1, 2, 3, 4, 5] filter 一部データを条件で絞って表示したい時に使います。 let array = [ (title: "Test1", status: false), (title: "Test2", status: true), (title: "Test3", status: false), (title: "Test4", status: false), (title: "Test5", status: true), (title: "Test6", status: true) ] let result = array.filter{ $0.status } print(result) ログ [(title: "Test2", status: true), (title: "Test5", status: true), (title: "Test6", status: true)] reduce 現場で使うとしたらこのパターンかな.. 配列のデータを足したいときに使います。 let array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] let result = array.reduce(0) { $0 + $1 } print(result) ログ 55 終わりに 今回は高階関数についての簡単な紹介でした。 かなり簡単に配列の操作ができるようになって楽だなっと思いながらいつも使っています。 覚えていない方はこの記事を見てどういう時に使うのかを頭に叩き込んで常に高階関数が使えるかどうか考えながら設計するのも良いと思います。 ここまで読んでいただきありがとうございます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む