15. 計算型プロパティ定義
enum PeachBoyEnemy {
case Oni
case Boss
…
var count: Int {
switch self {
case Oni:
return 10
case Boss:
return 1
}
}
}
• 計算型プロパティのみ定義することができる
16. Tuple
enum PeachBoyEnemy {
case Oni(String, String)
case Boss
func encount() {
switch self {
case Oni(let number, let colorName):
print(Number + ": Oni " + colorName)
case Boss:
print("Boss")
}
}
}
• CaseにTupleを指定することで異なる構造を持つ
メンバーを定義することができる
17. Tuple
let oni: PeachBoyEnemy = .Oni("1", "Red")
oni.encount()
• CaseにTupleを指定することで異なる構造を持つ
メンバーを定義することができる
1: Oni Red
18. AlamofireのRouterでの応用
enum Router: URLRequestConvertible {
case ItemSearch([String : AnyObject])
var URLString: String {
let baseURL = "http://shopping.yahooapis.jp/ShoppingWebService/V1/json/"
switch self {
case ItemSearch:
return baseURL + "itemSearch"
}
}
var Method: Alamofire.Method {
switch self {
case .ItemSearch:
return .GET
}
}
var URLRequest: NSMutableURLRequest {
let request = NSMutableURLRequest(URL: NSURL(string: URLString)!)
switch self {
case .ItemSearch(let parameters):
return Alamofire.ParameterEncoding.URL.encode(request, parameters: parameters).0
}
}
19. AlamofireのRouterでの応用
enum Router: URLRequestConvertible {
case ItemSearch([String : AnyObject])
…
var URLRequest: NSMutableURLRequest {
let request = NSMutableURLRequest(
URL: NSURL(string: URLString)!)
switch self {
case .ItemSearch(let parameters):
return Alamofire.ParameterEncoding.
URL.encode(
request, parameters: parameters).0
}
}
20. ジェネリクスの応用
public enum Result<Value, Error: ErrorType> {
case Success(Value)
case Failure(Error)
}
• tubleとジェネリクスを指定することで成功時、失
敗時も値を返すEnumを定義することができる
22. ジェネリクスの応用
let result = resultWithCode(200)
switch result {
case .Success(let code):
print(code)
case .Failure(let error):
print(error)
}
• 値はパターンマッチで比較することができる
23. 実際に使うケース
Alamofire.request(Router.ItemSearch(parameters))
.responseJSON { response in
switch response.result {
case .Success(let value) :
let json = JSON(value)
guard let resultSet = json["ResultSet"].dictionary else {
return
}
guard let resultsOfOnePage = resultSet["0"]?.dictionary else {
return
}
guard let results = resultsOfOnePage["Result"]?.dictionary else {
return
}
self.items = results.keys.map { Item(json: results[$0]!) }
case .Failure(let error) :
print("error: (error)")
}
self.tableView?.reloadData()
self.refreshControl?.endRefreshing()
}