LoginSignup
1
3

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-05-12

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

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

私について

数日前に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

import SwiftExtensions

Date

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) }

}

使用法

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

String

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)
    }

}

使用法

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

Screen Shot 2020-05-12 at 3.13.28 PM.png

UITableView

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()
    }

}

使用法

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

UIView

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() }

}

使用法

    //@IBOutlet weak var button1: UIView!
    //@IBOutlet weak var button2: UIView!

    button1.丸みのあるボーダー()
    button2.丸め()

Screen Shot 2020-05-12 at 3.17.56 PM.png

UIColor

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


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
    }

}

コード

:sunny:

iOS開発、Swift、プログラミングに関することなら何でも、遠慮なくTwitterで質問してください。
@MaShunzhe

私の他の記事

「iCloud CloudKit」と「Sign in with Apple」を使用してユーザー情報を保存します

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3