SwiftUIで TextField にクリアボタンをつける方法

## TextField にクリアボタンを付けたい
　TextField に文字が入力されたら、フイールドの右端に入力されたテキストを全部消すためのクリアボタンを付けたいと思ってネットを探したが、結構古い情報があって、やってみるとエラーになるものが多かった。
かつては UITextField のプロパティ ClearButton の設定を「Is always visible」に設定するだけだったのだが、SwiftUIのフレームワークにある TextField には ClearButton プロパティが無いので、自分で実装する必要があるらしい。

　成功した方法を見つけたサイトの情報は末尾に書いておくので詳しくはそちらを。

### 実現できたソース
 クリアボタンを付けることができた。　
クリアボタンはテキストフィールド内に表示させる場合と、テキストフィールドの外に表示させる場合の2種類を紹介する。

#### （1）テキストフィールド内にクリアボタンを付ける
![Simulator Screen Shot - iPod touch (7th generation) - 2022-01-26 at 09.16.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16491/a97d35e6-5dbe-fb66-7aee-f0aae0fd932e.png)
　テキストフィールド内にクリアボタンを付けるソースは以下のとおり。

```Swift:ContentView.swift
import SwiftUI

struct ContentView: View {
    @State var text: String = ""
    var body: some View {
        Form {
            Section() {
                TextField("NAME", text: $text)
                    .modifier(TextFieldClearButton(text: $text))
                    .textFieldStyle(RoundedBorderTextFieldStyle())
            }
        }
    }
}

struct TextFieldClearButton: ViewModifier {
    @Binding var text: String
    
    func body(content: Content) -> some View {
        ZStack(alignment: .trailing)
        {
            content
            if !text.isEmpty {
                Button(
                    action: {
                        self.text = ""
                        
                    })
                {
                    Image(systemName: "delete.left")
                        .foregroundColor(Color(UIColor.opaqueSeparator))
                }
                .padding(.trailing, 8)
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
```

#### テキストフィールドの右外にクリアボタンを付ける
![Simulator Screen Shot - iPod touch (7th generation) - 2022-01-26 at 09.30.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16491/ae97b8ca-27e0-9511-5d6e-4724c1d14a85.png)

　　テキストフィールドの外側（右側）にクリアボタンを付けるソースは以下のとおり。

```Swift:ContentoView.swift
import SwiftUI

struct ContentView: View {
    @State var text: String = ""
    var body: some View {
        Form {
            Section() {
                TextField("NAME", text: $text)
                    .modifier(TextFieldClearButton(text: $text))
                    .textFieldStyle(RoundedBorderTextFieldStyle())
            }
        }
    }
}

struct TextFieldClearButton: ViewModifier {
    @Binding var text: String
    
    func body(content: Content) -> some View {
        HStack
        {
            content
            if !text.isEmpty {
                Button(
                    action: {
                        self.text = ""
                        
                    })
                {
                    Image(systemName: "delete.left")
                        .foregroundColor(Color(UIColor.opaqueSeparator))
                }
                .padding(.trailing, 8)
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

```

### 参考になったサイト
https://stackoverflow.com/questions/58200555/swiftui-add-clearbutton-to-textfield