はじめに
いまさらですが、SwiftのEnumは強力ですね。
その中のEnumのAssociated Valueについて、再度整理したいと思います。
EnumのAssociated Valueとは?
型を問わず関連値を持つよう定義でき、
必要であれば列挙型のケースごとに異なる値の型にすることができます
実装イメージがつきづらいと思いますので、
Social frameworkの実装を例に
EnumのAssociated Valueを活用方法をご説明します。
サンプルコード
下記の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)
}
}
参考記事
下記の記事を参考にさせて頂きました。
大変勉強になりました。