LoginSignup
7
8

More than 5 years have passed since last update.

[Swift] Enum(Associated Value)を利用して、処理を簡略化する

Posted at

はじめに

いまさらですが、SwiftのEnumは強力ですね。
その中のEnumのAssociated Valueについて、再度整理したいと思います。

EnumのAssociated Valueとは?

型を問わず関連値を持つよう定義でき、
必要であれば列挙型のケースごとに異なる値の型にすることができます

実装イメージがつきづらいと思いますので、
Social frameworkの実装を例に
EnumのAssociated Valueを活用方法をご説明します。

APIを利用した活用例は、こちら

サンプルコード

下記のenumは、
(String, UIImage?)型の関連値を持つTwitter の値、または
(String, UIImage?)型の関連値を持つFacebook の値のいずれかを取ることができる
列挙型 SocialTypeを定義しています。

ソーシャル投稿用のEnum

SocialType.swift
import Foundation
import Social

enum SocialType {

    case Twitter (text: String, image: UIImage?)
    case Facebook (text: String, image: UIImage?)

    func postText(viewController: UIViewController) {

        switch self {
        case let Twitter(text, _):
            postSocalKit(SLServiceTypeTwitter, viewController: viewController, text: text)
            break
        case let Facebook(text, _):
            postSocalKit(SLServiceTypeFacebook, viewController: viewController, text: text)
            break
        }
    }

    func postTextAndImage(viewController: UIViewController) {

        switch self {
        case let Twitter(text, image):
            postSocalKit(SLServiceTypeTwitter, viewController: viewController, text: text, image: image)
            break
        case let Facebook(text, image):
            postSocalKit(SLServiceTypeFacebook, viewController: viewController, text: text, image: image)
            break
        }
    }

    private func postSocalKit(forServiceType: String, viewController: UIViewController, text: String, image: UIImage? = nil) {

        let composeViewController = SLComposeViewController(forServiceType: forServiceType)
        composeViewController.setInitialText(text)
        composeViewController.addImage(image)
        viewController.presentViewController(composeViewController, animated: true, completion: nil)
    }
}

使用方法

ViewController.swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func didTapButton(sender: UIButton) {

        guard let image = UIImage(named: "image") else {
            return
        }

        SocialType.Facebook(text: "スマートデバイス・テクノロジー",
            image: image).postTextAndImage(self)
    }
}

参考記事

下記の記事を参考にさせて頂きました。
大変勉強になりました。

7
8
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
7
8