[ライブラリ] Eurekaの導入と利用〜その6 様々な行を追加する2

はじめに

前回はActionSheet行やAlert行を作成しました。今回は以下について見ていきます。

過去記事は以下を参照してください。

環境

Xcode:9.2
Swift:4.0.3

DateInlineRow

DateInlineRowを使用すると、行内で日付を選択して入力することが可能です。また日付が変更された場合は、OnChangeイベントが発生するので、valueプロパティで変更後の値を取得することができます。

以下にコード例を示します。

form
    +++ Section("セクション")
    <<< DateInlineRow("") {
        $0.title = "日付を選択"
        }.onChange() { row in
            // 選択された日を表示
            print(row.value!)
    }

DateTimelineRow

DateTimeInlineRowを使用すると、行内で日付と時間を選択して入力することが可能です。また日時が変更された場合は、OnChangeイベントが発生するので、valueプロパティで変更後の値を取得することができます。

 form
    +++ Section("セクション")
    <<< DateTimeInlineRow("") {
        $0.title = "日時を選択"
        //$0.value = date
        }.onChange() { row in
            // 選択された日時を表示
            print(row.value!)
        }

TimeInlineRow

TimeInlineRowを使用すると、行内で時間を選択して入力することが可能です。また時間が変更された場合は、OnChangeイベントが発生するので、valueプロパティで変更後の値を取得することができます。

form
    +++ Section("セクション")
    <<< TimeInlineRow("") {
        $0.title = "時刻を選択"
        //$0.value = date
        }.onChange() { row in
            // 選択された時刻を表示
            print(row.value!)
        }

任意の日付を選択状態にするには?

DateInlineRow, DateTimeInlineRow, TimeInlineRowのいずれも初期値は現在日時です。任意の日時を選択したい場合は、DateFormatterで日付を作成し、$0.value = date のように作成した日付を設定してあげます。

以下にコード例を示します。

let formatter = DateFormatter()
let now = "2017/8/12"
formatter.dateFormat = "yyyy/MM/dd"
formatter.locale = Locale(identifier: "ja_JP")
let date = formatter.date(from: now)

form
    +++ Section("セクション")
    <<< DateTimeInlineRow("") {
        $0.title = "日時を選択"
        $0.value = date
        }.onChange() { row in
            // 選択された日時を表示
            print(row.value!)
        }

DateRow

DateInlineRowは、行内で選択することができましたが、DateRowの場合は下からPickerがニュルッと出てきます。使用方法はDateInlineRowと同じです。

form
    +++ Section("セクション")
    <<< DateRow("") {
        $0.title = "日付を選択"
        }.onChange() { row in
            // 現在のチェック状態を表示
            print(row.value!)
    }

DateTimeRow

DateTimeInlineRowは、行内で選択することができましたが、DateTimeRowの場合は下からPickerがニュルッと出てきます。使用方法はDateTimeInlineRowと同じです。

form
    +++ Section("セクション")
    <<< DateTimeRow("") {
        $0.title = "日時を選択"
        //$0.value = date
        }.onChange() { row in
            // 選択された日時を表示
            print(row.value!)
        }

TimeRow

TimeInlineRowは、行内で選択することができましたが、TimeRowの場合は下からPickerがニュルッと出てきます。使用方法はTimeInlineRowと同じです。

form
    +++ Section("セクション")
    <<< TimeRow("") {
        $0.title = "時刻を選択"
        //$0.value = date
        }.onChange() { row in
            // 選択された時刻を表示
            print(row.value!)
        }

[ライブラリ] Eurekaの導入と利用〜その5 様々な行を追加する1

はじめに

前回は1行入力欄や複数行入力欄を作成しました。今回は以下について見ていきます。

  • ActionSheet行
  • Alert行

過去記事は以下を参照してください。

環境

Xcode:9.2
Swift:4.0.3

ActionSheet行

ActionSheet行を追加すると、複数の選択肢の中から1項目を選択することができます。

例えば、「犬」「猫」「フェレット」の中からペットを1つ選択させたい場合は以下のようにします。

form
    +++ Section("セクション")
    <<< ActionSheetRow<String>("") {
        $0.title = "ペット"
        $0.selectorTitle = "ペットを選択"
        $0.options = ["犬","猫","フェレット"]
        $0.value = "フェレット"    // 初期選択項目
    }.onChange{row in
        print(row.value as Any)
    }
  • 4行目:titleプロパティは、行先頭に表示するタイトルです
  • 5行目:selectorTtitleプロパティは、行を選択した時に表示されるアクションシートのタイトルです
  • 6行目:optionsプロパティは、アクションシートに表示する選択項目です
  • 7行目:valueプロパティは、初期選択項目です
  • 8行目:onChangeは選択項目が変更されたときのアクションです。ここでは選択された項目を表示しています。

Alert行

Alert行を追加すると、複数の選択肢の中から1項目を選択することができます。Action行と使用方法は同じで、違いは表示される位置です。Action行はタップすると、選択肢が画面下からニュルッと出てきますが、Alert行は画面中央に表示されます。

Alert行のコード例を以下に示します。この例はAction行のコードをAlertに変更しただけのものです。

form
    +++ Section("セクション")
    <<< AlertRow<String>("") {
        $0.title = "アラート行"
        $0.selectorTitle = "ペットを選択"
        $0.options = ["犬","猫","フェレット"]
        $0.value = "フェレット"    // 初期選択項目
        }.onChange{row in
            print(row.value as Any)
	}
    }

実行例を以下に示します。

 

[ライブラリ] Eurekaの導入と利用〜その4 行の値を取得する

はじめに

前回は1行入力欄や複数行入力欄を作成しました。

今回は、行に入力された値を取得する方法を見ていきます。

過去記事は以下を参照してください。

 環境

Xcode:9.2
Swift:4.0.3

Eurekaのコールバック関数

Eurekaには、行の値を取得したり外観を変更するためのコールバック関数があります。

以下に使用可能なコールバック関数を示します。

コールバック関数 説明
onChange 行の値が変更されたときに呼び出されます。
onSellSelection ユーザーが行をタップして選択されたときに呼び出されます。
cellSetup セルが最初に設定されたときに一度だけ呼び出されます。
cellUpdate セルが画面に表示されるたびに呼び出されます。
onCellHighlightChanged セルまたはサブビューが最初のレスポンダになるときに呼び出されます。
onRowValidationChanged 行に関連付けられた検証エラーが変更されたときに呼び出されます。
onExpandInlineRow インライン行を展開する前に呼び出されます。I
onCollapseInlineRow インライン行を折りたたむ前に呼び出されます。
onPresent  別のView Controllerを表示する直前に行によって呼び出されます。

行の値を取得する

行の値を取得するには、コールバック関数onChangeを使用します。

コード例を以下に示します。

form
    +++ Section("セクション1")
    <<< TextRow { row in
        row.title = "タイトル"
        row.placeholder = "タイトルを入力"
        }.onChange{row in
            let value = row.value
            print(value!)
        }

上記は1行テキストの入力欄を作成し、onChangeの中でテキストを取得しています。

様々なコールバック関数がありますが、作成する行によっては使用不可能なものもあります。

今後機会があれば、そのほかのコールバック関数も取り上げる予定です。

[ライブラリ] Eurekaの導入と利用〜その3 入力欄を作成する

はじめに

前回までの記事では、Eurekaを使用するための前準備を行いました。

今回からは、いよいよ設定画面の作成方法を見ていきます。

過去記事は以下を参照してください。

入力欄を作成しよう

Eurekaを使用して作成できる設定画面はTableViewで作られていますが、View ControllerにTableViewを貼り付けたりdataSourceやdelegateの設定をする必要はありません。

前回説明したように、Eurekaのライブラリをインポートし、継承元のクラスをFormViewControllerに設定すれば、設定画面作成の準備は完了となります。

import UIKit 
import Eureka // 追加 
class EurekaViewController: FormViewController { // 継承元を変更

}

設定画面の初期化コードは、View Controllerが読み込まれたときに行いますので、viewDidLoad()メソッドの中に書くとよいでしょう。

設定画面を作成する

1.フォームの準備

はじめにフォームを1つ準備してあげる必要があります。フォームを準備するには「form」と記述するだけです。

form

2.セクションの作成

フォームができたらセクションを作成します。

1つの設定画面には、複数のセクションを持たせることができます。セクションを作成するには、Eureka専用の演算子「+++」を使用します。以下のようにすると、先ほど作成したformに、タイトルが「セクション1」というセクションを追加することができます。

form
+++ Section("セクション1")

3.入力欄の作成

セクションが作成できたら、今度は入力欄を作成してみましょう。Eurekaは様々な入力欄を簡単に作成できるようになっていますが、ここでは1行入力欄と複数行の入力欄を作成することとします。

入力欄を作成するにはEureka専用の演算子「<<<」を使用します。

1行の入力欄を作成するにはEurekaが持つTextRowというクラスを用します。また入力欄の行にはタイトルとプレースホルダを設定することができるようになっています。

コード例は以下の通りです。先ほど作成したセクション1の下に1行入力欄を追加しています。row.titleは行の先頭に表示するタイトル設定用のプロパティで、row.placehoderがプレースホルダ(透かし文字)用のプロパティです。

form
 +++ Section("セクション1")
 <<< TextRow { row in
 row.title = "タイトル"
 row.placeholder = "タイトルを入力"
}

次に複数行の入力欄を作成してみましょう。こちらはTextAreaRowというクラスを使用します。複数行の入力欄はタイトルを付けることができないようでが、1行入力欄同様にプレースホルダの設定をすることは可能です。

form
 +++ Section("セクション1")
 <<< TextRow { row in
   row.title = "タイトル"
   row.placeholder = "タイトルを入力"
 }
 <<< TextAreaRow { row in
   row.placeholder = "メモを入力"
 }

さらにセクションと1行入力欄を追加するには、以下のようにします。

form
    +++ Section("セクション1")
    <<< TextRow { row in
        row.title = "タイトル"
        row.placeholder = "タイトルを入力"
    }
    <<< TextAreaRow { row in
        row.placeholder = "メモを入力"
    }
    // ここからセクション2のコード
    +++ Section("セクション2")
    <<< TextRow { row in
        row.title = "1行メモ"
        row.placeholder = "1行メモを入力"
    }

実行してみよう

実行すると、以下のようにセクションが2つとその下に入力欄がある設定画面が表示されます。

今回作成したコード全体を以下に示します。

import UIKit
import Eureka   // 追加

class EurekaViewController: FormViewController { // 継承元を変更

    override func viewDidLoad() {
        super.viewDidLoad()

        form
            +++ Section("セクション1")
            <<< TextRow { row in
                row.title = "タイトル"
                row.placeholder = "タイトルを入力"
            }
            <<< TextAreaRow { row in
                row.placeholder = "メモを入力"
            }
            // ここからセクション2のコード
            +++ Section("セクション2")
            <<< TextRow { row in
                row.title = "1行メモ"
                row.placeholder = "1行メモを入力"
            }

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    

    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
    }
    */

}

 

 

 

 

 

[ライブラリ] Eurekaの導入と利用〜その2(設定画面の下準備)

はじめに

前回はEurekaをプロジェクトにインストールするところまでの説明をしました。

今回は、Storyboardに設定画面用のView Controllerの追加方法と、設定画面用のクラスファイルを作成する方法を見ていきます。

環境

Xcode:9.2
Swift:4.0.3

Navigation Controllerを追加する

Eurekaは設定画面を簡単に作成することができるライブラリです。ここでは、設定画面を作ることを想定して、サンプルアプリを作成していきます。

そこで、View Controllerの上部にはNavigation Barを表示し、「+」ボタンがタップされた時に設定画面が開かれるようにします。

はじめに、前回作成したプロジェクトを開いてください。EurekaSample1という名前でプロジェクトを作成している場合は、EurekaSample1.xcworkspaceという名前のファイルをダブルクリックして開きます。

続いてMain.storyboardを開きましょう。View Controllerを選択をしたら、メニューから[Editor]-[Embeded in]-[Navigation Controller]を選択します。

Navigation Controllerが追加され、Main.storyboardは以下のようになります。

続いて、View Controllerに配置されたNavigation Barの上にBar Button Itemを1つ配置します。

次に、今配置したBar Button Itemを+アイコンに変更します。配置したBar Button Itemを選択したら、Attributes InspectorのSystem Itemを「Add」に変更します。

これで、「+」アイコンに変更されます。

続いて設定ページ用のView Controllerを追加します。オブジェクトライブラリからMain.storyboardにView Controllerを1つ追加してください。

最後に、先ほどの「+」ボタンをタップした時に設定用ページが開かれるようにします。

「+」ボタンを[control]キーを押しながらドラッグし、追加したView Controllerの上にドロップします。メニューが表示されるので「show」を選択してください。

以上でMain.storyboardの設定は完了です。

完成したMain.storyboardは以下のようになります。

Eurekaを使って設定画面を作成する

ここからは、Eurekaを使用して設定画面を作成していきます。

はじめに、設定画面用のView Controllerクラスを作成します。

メニューから新規ファイルの作成で「Cocoa Touch Class」を作成します。

次にClass名を入力(ここではEurekaViewControllerとしました)してSubclass ofでUIViewControllerを選択して[Next]を選択します。

最後に保存先を選択して、[create]ボタンをクリックします。

今作成したファイルをダブルクリックして開き、「import Eureka」を追加し、継承元を「ViewController」から「FormViewController」に変更してください。

import UIKit
import Eureka   // 追加

class EurekaViewController: FormViewController { // 継承元を変更

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    

    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
    }
    */

}

ここまでできたら[command]+[B]を押して一度ビルドしましょう。

ビルドができたらMain.storyboardを開いて、一番最後のView Controllerに対して今作成したクラスを割り当てます。

以上で下準備は完了です。

次回から設定画面を作成していきます。

[ライブラリ] Eurekaの導入と利用〜その1(ライブラリのインストール)

はじめに

iOSアプリ用の設定画面を作成するには、TableViewを使用するのが一般的です。

しかし、TableViewを利用するには覚えることも多く、1ページ作成するだけでも結構大変です。

そこで、Eureka(ユーリカ)というライブラリを導入すると、簡単にTableViewのページデザインが可能ですので、今回はそのインストールについてみていきます。

環境

Xcode:9.2
Swift:4.0.3

インストール

EurekaのインストールはCocoa Podsを利用します。Cocoa Podsのインストールについては過去記事「CocoaPodsの導入」を参照ください。

はじめにSingle View Appのプロジェクトを作成します。

続いて、Teminalを起動して作成したプロエクト先に移動して以下のコマンドを実行し、podファイルを作成します。

pod init

作成されたpodファイルを開いて、以下のように編集します。

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'EurekaSample' do
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
  source 'https://github.com/CocoaPods/Specs.git'
  platform :ios, '9.0'
  use_frameworks!

  # Pods for EurekaSample
  pod 'Eureka'
end

編集が完了したら、Terminalで以下のコマンドを実行してインストールします。

pod install

podファイルの作成からインストールを実行するまでのTerminalのスクショを参考までに載せておきます。

次回以降、実際にEurekaを使用する方法を見ていきます。

[Tips] 使用中のデバイスを判定するには?

環境

Xcode:9.2
Swift:4.0.3

使用中のデバイスを判定するには?

使用中のデバイスを判定するには、UIDevice.current.userInterfaceIdiomを使用します。

例えば、現在使用中のデバイスがiPadかを調べるには、以下のコードで調べることができます。

if UIDevice.current.userInterfaceIdiom  == .pad {

}

userInterfaceIdiomには以下のような値があります。

説明
phone iPhone
pad iPad
tv Apple TV
carPlay Car Play

[Tips] UIViewControllerをポップオーバーさせるには?

はじめに

今回は任意のUIViewControllerをポップオーバーさせる方法についてみていきます。

ポップオーバーとは、ボタンをタップした時に子画面を表示させることです。

iPadのカレンダーアプリで+ボタンをタップしたときに表示される「新規イベント」のような画面と考えてください。

 環境

Xcode:9.2
Swift:4.0.3

ポップオーバー呼び出し側のデザイン

はじめにSingle View Appのプロジェクトを作成します。

つづいてMain.storyboardを開いて、View Controllerの上部にNavigation Barを配置し、その右側にBar Button Itemを1つ配置してください。

次に、今追加したBar Button Itemを+アイコンに変更します。Bar Button Itemを選択してSystem Itemを「Add」にします。

これで、以下のように+アイコンへと変わります。

ポップオーバーのデザイン

続いてポップオーバーされるビューを作成します。

Main.storyboardにView Controllerを1つ追加してください。

追加したView Controllerが白い背景色だとわかりにくいので別の色を設定しておきます(ここではオレンジにしました)。

次に、ポップオーバーされた時のサイズを変更します。①View Controllerをくりくして選択したら、②Size inspectorを選択します。③Simulated Sizeで「Freeform」を選択したら幅と高さを任意のサイズに変更します。

最後にAttributes inspectorを選択してContent Sizeのところにチェックをつけます。サイズは、先ほど設定した値になっていますので変更せずにそのままとします。

セグエで接続する

呼び出し元と呼び出し先のページができたのでセグエで接続をします。

メインのView Controllerに配置した「+」ボタンをタップした時にポップオーバーされるようにします。

[control]キーを押しながら「+」ボタンをポップオーバーするページへドラッグしてセグエ接続します。このときAction Segueは「Present As Popover」を選択します。

コードの実装

最後にコードを実装します。

メインのViewController.swiftを開いて、

UIPopoverPresentationControllerDelegateを継承させます。

class ViewController: UIViewController, UIPopoverPresentationControllerDelegate  {

次に、以下のコードを挿入してください。

// 前準備
override func prepare (for segue: UIStoryboardSegue, sender: Any?) {
    // セグエのポップオーバー接続先を取得
    let popoverCtrl = segue.destination.popoverPresentationController
    
    // 呼び出し元がUIButtonの場合
    if sender is UIButton {
        // タップされたボタンの領域を取得
        popoverCtrl?.sourceRect = (sender as! UIButton).bounds
    }
    // デリゲートを自分自身に設定
    popoverCtrl?.delegate = self
}

// 表示スタイルの設定
func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
    // .noneを設定することで、設定したサイズでポップオーバーされる
    return .none
}

上記のコードは2つのメソッドがあります。1つ目のprepareは前準備です。

セグエのポップオーバーの接続先をどこに表示するかの設定を行なっています。

タップされたボタンの下に表示させたいので、prepareの呼び出し元がUIButtonかどうかを判断しています。UIButtonだった場合は、そのUIButtonの位置をsourceRectプロパティに代入し、表示位置を決めています。

もう1つのadaptivePresentationStyleメソッドはポップオーバーが表示されるときのスタイルを設定するためのものです。.noneを返却することで、設定したサイズで表示されるようになります。

実行してみよう

実行をして「+」ボタンをタップすると以下のように「+」ボタンの下にポップオーバー表示されるようになります。

 

 

[Realm] モデルを作成してデータを登録する

はじめに

Realmは様々なプラットフォームで使用可能な軽量データベースです。

Realmのインストールについては、過去の記事「CarthageとRealmのインストール」を参照してください。

本記事では、Realm用のモデル作成とデータの登録方法について備忘録として記載します。

環境

Xcode:9.2
Swift:4.0.3
RealmSwift:3.3.2

プロジェクトの作成

新規でSingle View Appのプロジェクトを作成したら、過去記事を参考にSwiftRealmを導入します。

モデルの作成

ここでは、部署と部署に属する社員を管理するモデルを作成します。

部署モデルでは、「部署名」とマネージャーの「氏名」、部に属する「社員」を管理できるようにします。

新規で「Department.swift」というSwift Fileを作成し、Departmentクラスを以下のように作成します。

import Foundation
import RealmSwift

class Department: Object {
    // 部署名
    @objc dynamic var name : String = ""
    // マネージャーの氏名
    @objc dynamic var manager : String = ""
    // 部に属する社員
    let employees = List<Employee>()
    
    // プライマリーキー
    override static func primaryKey() -> String? {
        return "name"
    }
    
    // インデックス
    override static func indexedProperties() -> [String] {
        return ["name"]
    }
}

Realm用のモデルを作成するには、「import RealmSwift」が必要です。また、クラスはObjectを継承する必要があります。

モデルに登録するそれぞれの項目はプロパティとして定義します。このとき「@objc dynamic var」で宣言します。

プロパティで使用できるデータ型にはBool、Int、Int8、Int16、Int32、Int64、Double、Float、String、Date、とDataがあります。

部署名やマネージャーの氏名は文字列を登録しますのでString型にしています。

また、部に属する社員は複数登録できるようにList<epmplyee>としています。

次に、社員を管理するEmplyeeクラスを作成します。このクラスは先ほど作成したDepartment.swiftの中に作成しても構いません。

class Employee : Object {
    // 社員の氏名
    @objc dynamic var name: String = ""
    // 社員の年齢
    @objc dynamic var age: String = ""
}

以上でモデルの作成は完了です。

データを登録してみる

それではデータを登録してみましょう。

はじめに部署のみを登録する方法をみてみます。

let realm = try! Realm()  // Realmの初期化

// Engineer型オブジェクトの作成
let dept = Department()
// Realmへのオブジェクトの書き込み
try! realm.write {
    dept.name = "システム部"
    dept.manager = "Bill"
    realm.add(dept)
}

はじめにRealmの初期化を行います。

次に、部署を管理するEngineerのオブジェクト(インスタンス)を作成します(4行目)。

あとは、realm.writeメソッドを使用してデータを登録します(6行目以降)。

Realm Browserで確認すると以下のようにデータが登録できていることが確認できます。参考「[Tips] Realmファイルの保存先を知るには?

この時点ではEmployeesは「0」になっているので登録されていないことがわかります。

子データを登録する

今度は、部署に属する社員を登録してみましょう。

社員を登録するには、まず登録先の部署を検索して取得する必要があります。

検索するにはRealmインスタンスのobjectsが持つfilterメソッドを使用します。以下にコード例を示します。ここでは「nameが’システム部’と等しい」を条件にして抽出しています。

let realm = try! Realm()
let dept = realm.objects(Department.self).filter("name == 'システム部'").first

つづいて、部に追加する社員を作成します。

let emp = Employee()
emp.name = "Oscar"
emp.age = "23"

あとは、writeメソッドを使用して登録をするだけです。部を検索して社員を登録するまでのコードを以下に示します。

let realm = try! Realm()
let dept = realm.objects(Department.self).filter("name == 'システム部'").first
let emp = Employee()
emp.name = "Oscar"
emp.age = "23"
try! realm.write {
    dept?.employees.append(emp)
}

登録が成功すると以下のように社員が登録できていることを確認できます。

子データを削除する

続いて子データを削除してみましょう。

先ほどのfilterメソッドを使用して、システム部を検索し、さらにシステム部に属する「Oscar」を削除する場合は以下のようにします。

// 子データの削除
let realm = try! Realm()
let dept = realm.objects(Department.self).filter("name == 'システム部'").first
let emp = dept?.employees.filter("name == 'Oscar'").first

try! realm.write {
    realm.delete(emp!)
}

削除はrealm.writeメソッドの中で「realm.delete(削除したいオブジェクト)」とします。

親データを削除する

親データも子データ同様にfilterメソッドで特定して削除をします。

// 親データの削除
let realm = try! Realm()
let dept = realm.objects(Department.self).filter("name == 'システム部'").first

try! realm.write {
    realm.delete(dept!)
}

Realmファイルを削除するには

Realmによるデータは、Realmファイルに格納されます。何らかの事情でリセットしたい場合は以下のコードを書くことでまっさらにすることができます。

let realmURL = Realm.Configuration.defaultConfiguration.fileURL!
let realmURLs = [
    realmURL,
    realmURL.appendingPathExtension("lock"),
    realmURL.appendingPathExtension("note"),
    realmURL.appendingPathExtension("management")
]
for URL in realmURLs {
    do {
        try FileManager.default.removeItem(at: URL)
    } catch {
        // handle error
    }
}

[Tips] Realmファイルの保存先を知るには?

RealmのデータベースファイルはRealm Browserというツールで確認できます。しかし、アプリで作成したデータベースファイルがどこにあるかは非常にわかりにくくなっています。

データベースファイルがどこにあるのかを知るには、Realmの初期化の後にprint文で場所を調べます。

let realm = try! Realm()  // Realmの初期化
print(Realm.Configuration.defaultConfiguration.fileURL!)