（今後も更新予定）Swiftの便利な拡張 (extension)

この投稿は今後も継続的に更新される予定です。

**記事に対してご提案がありましたら、編集するか以下にコメントを投稿してください。**

#### 私について
数日前にSwiftプログラミングについての記事を書き始めました。是非ともこちらで記事をご覧ください。また、今後の更新に向けて @MaShunzhe、Twitter上でもフォローしていただくようお願いします！

#### 記事上で:
> ‪⭐️ Date().文() //2020-05-12
> ‪⭐️ Date().取得(.month)
> ⭐️ tableView.最上部()‬
> ⭐️ tableView.最下部()
> ⭐️ "こんにちは".アラートを表示(on: self). ‬
> ⭐️ view1.丸みのあるボーダー()
> ⭐️ view2.丸め()
> ⭐️ view.スクリーンショット()
> ⭐️ getUISceneDelegate()
> ⭐️ getUIApplicationDelegate()

## "Extension"とは

Swiftにおいて、Extensionsとは既存クラスの機能を拡張する手段です。自分で作成するか、システムフレームワークに含まれており、プログラミング作業を楽にしてくれます。

## クラスを拡張する方法は？
extension : "class 名" { //TODO: あなたのコード }
Xcodeプロジェクトの任意の場所に作成したファイルに拡張コードを記述すれば、別のファイルから利用することができます。 https://docs.swift.org/swift-book/LanguageGuide/Extensions.html

## 便利な拡張

私が自分のプログラムで利用した便利な拡張を紹介します。

ここにコード: https://github.com/mszopensource/Swift-Extensions

```swift
import SwiftExtensions
```

### Date
```swift
extension Date {
    
    /*
     日付オブジェクトの分かりやすい説明を取得する
     Get the plain words description from a date object
     */
    func getString() -> String {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd"
        return formatter.string(from: self)
    }
    
    func 文() -> String { return getString() }

    func getComponent(_ component: Calendar.Component) -> Int {
        return Calendar.current.component(component, from: self)
    }
    
    func 取得(_ component: Calendar.Component) -> Int { getComponent(component) }
    
}
```

使用法

```swift
Date().文() //2020-05-12
Date().取得(.month) //5
```

### String
```swift
extension String {
    
    /*
     文字列を渡してシンプルなUIAlertControllerを表示する。
     Show a simple UIAlertController with the given string.
     */
    func showSimpleAlert(on: UIViewController?) {
        guard let onVC = on else { return }
        DispatchQueue.main.async {
            let alert = UIAlertController(title: "アラート", message: self, preferredStyle: .alert)
            let actionDismiss = UIAlertAction(title: "キャンセル", style: .cancel, handler: nil)
            alert.addAction(actionDismiss)
            onVC.present(alert, animated: true, completion: nil)
        }
    }
    
    func アラートを表示(on: UIViewController?) {
        showSimpleAlert(on: on)
    }
    
}
```

使用法

```swift
"こんにちは".アラートを表示(on: self)
```

<img width="326" alt="Screen Shot 2020-05-12 at 3.13.28 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/d6d4736f-738e-a432-5d77-0040de335041.png">

### UITableView
```swift
extension UITableView {

    /*
     UITableViewを最上部にスクロールする
     Scroll the UITableView to the top
     */
    func scrollToTop() {

        DispatchQueue.main.async {
            let indexPath = IndexPath(row: 0, section: 0)
            self.scrollToRow(at: indexPath, at: .top, animated: false)
        }
    }
    
    func 最上部(){
        scrollToTop()
    }

    /*
     UITableViewを最下部にスクロールする
     Scroll the UITableView to the bottom
     */
    func scrollToBottom(){
        DispatchQueue.main.async {
            let indexPath = IndexPath(
                row: self.numberOfRows(inSection:  self.numberOfSections-1) - 1,
                section: self.numberOfSections - 1)
            self.scrollToRow(at: indexPath, at: .bottom, animated: true)
        }
    }
    
    func 最下部(){
        scrollToBottom()
    }
    
}
```

使用法

```swift
//@IBOutlet weak var tableView: UITableView!
tableView.最上部()
tableView.最下部()
```

### UIView
```swift
public extension UIView {
    
    /*
     ボーダーで縁取られ、丸みを帯びたボタンとしてUIViewを設定する。
     */
    func setUpOutlinedRoundButton(color: UIColor = .systemPink) {
        self.layer.cornerRadius = 10
        self.layer.borderColor = color.cgColor
        self.layer.borderWidth = 2
        self.clipsToBounds = true
    }
    
    func 丸みのあるボーダー(color: UIColor = .systemPink) {
        setUpOutlinedRoundButton(color: color)
    }
    
    /*
     丸みを帯びたボタンとしてUIViewを設定する
     */
    func setUpRoundButton(color: UIColor = .systemPink) {
        self.layer.cornerRadius = 10
        self.backgroundColor = color
        self.clipsToBounds = true
    }
    
    func 丸め(color: UIColor = .systemPink){
        setUpRoundButton(color: color)
    }

    func takeScreenshot() -> UIImage? {
        
        // Begin context
        UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, UIScreen.main.scale)

        // Draw view in that context
        drawHierarchy(in: self.bounds, afterScreenUpdates: true)

        // And finally, get image
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return image
        
    }
    
    func スクリーンショット() -> UIImage? { return takeScreenshot() }
    
}
```

使用法

```swift
    //@IBOutlet weak var button1: UIView!
    //@IBOutlet weak var button2: UIView!
    
    button1.丸みのあるボーダー()
    button2.丸め()
```

<img width="370" alt="Screen Shot 2020-05-12 at 3.17.56 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/7ac8fb94-acab-96cc-073a-505cf859366a.png">

### UIColor
```swift
public extension UIColor {
    
    /*
     オーシャンブルー
     */
    class var oceanBlue: UIColor {
        return .init(red: 0, green: 105/255, blue: 148/255, alpha: 1)
    }
    
    class var オーシャンブルー: UIColor { return oceanBlue }
    
    /*
     ライトスカイブルー
     */
    class var lightSkyBlue: UIColor {
        return .init(red: 135/255, green: 206/255, blue: 235/255, alpha: 1)
    }
    
    class var ライトスカイブルー: UIColor { return lightSkyBlue }
    
    /*
     スカイブルー
     */
    class var skyBlue: UIColor {
        return .init(red: 0, green: 191/255, blue: 255/255, alpha: 1)
    }
    
    class var スカイブルー: UIColor { return skyBlue }
    
    /*
     フォレストグリーン
     */
    class var forestGreeen: UIColor {
        return .init(red: 34/255, green: 139/255, blue: 34/255, alpha: 1)
    }
    
    class var フォレストグリーン: UIColor { return forestGreeen }
    
    /*
     イエローグリーン
     */
    class var yellowGreen: UIColor {
        return .init(red: 154/255, green: 205/255, blue: 50/255, alpha: 1)
    }
    
    class var イエローグリーン: UIColor { return yellowGreen }
    
}
```

## UIViewController

```swift

public extension UIViewController {
    
    @available(iOS 13.0, *)
    func getUISceneDelegate() -> UISceneDelegate? {
        return self.view.window?.windowScene?.delegate
    }
    
    @available(iOS 13.0, *)
    func getUIApplicationDelegate() -> UIApplicationDelegate? {
        return UIApplication.shared.delegate
    }
    
}

```

## コード
https://github.com/mszopensource/Swift-Extensions

## :sunny:
iOS開発、Swift、プログラミングに関することなら何でも、遠慮なくTwitterで質問してください。 
@MaShunzhe
### 私の他の記事
[「iCloud CloudKit」と「Sign in with Apple」を使用してユーザー情報を保存します]()