New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

`NSCoding`と`NSKeyedUnarchiver`を使ってファイルに保存していたのを、`Codable`を使った方法に変更 #1

Merged
merged 11 commits into from Dec 5, 2017

Conversation

Projects
None yet
2 participants
@hhyyg
Owner

hhyyg commented Dec 5, 2017

No description provided.

@mono0926

特にCodable周りをずっとスッキリ書けそう

// Put the code you want to measure the time of here.
}
}

This comment has been minimized.

@mono0926

mono0926 Dec 5, 2017

Collaborator

不要な行は消しましょう。

//do
_ = try! JSONDecoder().decode(UIImageWrapper.self, from: encoded)
}

This comment has been minimized.

@mono0926

mono0926 Dec 5, 2017

Collaborator

encode/decodeして、#imageLiteral(resourceName: "filledStar")とequalになるか検証が良さそう。
(そもそもそれでequal扱いになるかちょっと自信無いけど)

This comment has been minimized.

@mono0926

mono0926 Dec 5, 2017

Collaborator

(そもそもそれでequal扱いになるかちょっと自信無いけど)

画像はUIImagePNGRepresentationで可逆変換になってるものの、微妙 🤔

This comment has been minimized.

@hhyyg

hhyyg Dec 5, 2017

Owner

不要になったので、テスト自体削除しました。

import Foundation
struct AppError: Error {

This comment has been minimized.

@mono0926

mono0926 Dec 5, 2017

Collaborator

enumで、decodeFailedとか種別用意した方が良い。

This comment has been minimized.

@hhyyg

hhyyg Dec 5, 2017

Owner

なるほど。整理したらAppError不要になったので削除しました。

//
// Created by mono on 2017/02/11.
// Copyright © 2017 mono. All rights reserved.
//

This comment has been minimized.

@mono0926

mono0926 Dec 5, 2017

Collaborator

mono発見( ´・?・`)

This comment has been minimized.

@hhyyg

hhyyg Dec 5, 2017

Owner

Bundle.main.bundleIdentifier に変更して使いました

case OSLogType.error:
return "‼️(error)"
case OSLogType.fault:
return "💣(fault)"

This comment has been minimized.

@mono0926

mono0926 Dec 5, 2017

Collaborator

絵文字、赤系の目立つ色が良かったと後悔中。

print("url: \(Meal.archiveUrl)")
logger.debug("Meals successfully saved")
} catch {
fatalError(error.localizedDescription)

This comment has been minimized.

@mono0926

mono0926 Dec 5, 2017

Collaborator

なんでlogger使わずにfatalErrorしたか疑問。
このケースでクラッシュさせたいならdo-try使わずにtry!すれば良い。他も同様。

This comment has been minimized.

@hhyyg

hhyyg Dec 5, 2017

Owner

意味はなく。整理しました。

print("url: \(Meal.archiveUrl)")
logger.debug("Meals successfully saved")
} catch {
fatalError(error.localizedDescription)
}
}
private func loadMeals() -> [Meal]? {

This comment has been minimized.

@mono0926

mono0926 Dec 5, 2017

Collaborator

このあたり別クラスに分けたほうが良いね。

This comment has been minimized.

@hhyyg

hhyyg Dec 5, 2017

Owner

分けました。

public struct UIImageWrapper: Codable {
public let image: UIImage
public enum CodingKeys: String, CodingKey {

This comment has been minimized.

@mono0926

mono0926 Dec 5, 2017

Collaborator

多分無しで動く。

import UIKit
public struct UIImageWrapper: Codable {
public let image: UIImage

This comment has been minimized.

@mono0926

mono0926 Dec 5, 2017

Collaborator

imageData: Dataのプロパティを持つ構造(イニシャライザーあたりでUIImageからDataに変換)にしたら、下のpublic init(from decoder: Decoder) throwsとかの記述がみんな不要になるはず。

This comment has been minimized.

@hhyyg

hhyyg Dec 5, 2017

Owner

すごく整理できました。

@hhyyg

This comment has been minimized.

Owner

hhyyg commented Dec 5, 2017

@mono0926 修正しました

import Foundation
class FileStorage {
static func store<T>(atPath pathString: String, value: T) throws where T: Encodable {

This comment has been minimized.

@mono0926

mono0926 Dec 5, 2017

Collaborator

where使わずにstore<T: Encodable>で書けるはずで、これで済む場合はこっちの方がシンプル・見やすいので推奨かも。

This comment has been minimized.

@hhyyg

hhyyg Dec 5, 2017

Owner

なるほど修正しました

class FileStorage {
static func store<T>(atPath pathString: String, value: T) throws where T: Encodable {
let data = try JSONEncoder().encode(value)
if FileManager.default.fileExists(atPath: pathString) {

This comment has been minimized.

@mono0926

mono0926 Dec 5, 2017

Collaborator

let fm = FileManager.defaultしてfmを使う方が書きやすい。

This comment has been minimized.

@mono0926

mono0926 Dec 5, 2017

Collaborator

let fm = FileManager.defaultしてfmを使う方が書きやすい。

2回以上使う場合。

This comment has been minimized.

@hhyyg

hhyyg Dec 5, 2017

Owner

fmは慣習。スコープも少ないので、fm に変更しました。

}
static func retrive<T>(atPath pathString: String) throws -> T? where T: Decodable {
if let data = FileManager.default.contents(atPath: pathString) {

This comment has been minimized.

@mono0926

mono0926 Dec 5, 2017

Collaborator

戻り値がOptionalかつthrowsなことに違和感。
どっちかに寄せた方が良い。

This comment has been minimized.

@hhyyg

hhyyg Dec 5, 2017

Owner
  • ファイルが存在しない場合は、正常系としてありえるので、nil を返したい
  • エラーが発生する場合は落としたい
    という意図がありました。
    この場合は、エラーは発生した時点で落としてよかったので、FileStorage内で try! に変更しました。
    結果、他のところで try が少なくなりスッキリしたと思います。
@@ -17,7 +17,7 @@ class MealTableViewController: UITableViewController {
super.viewDidLoad()
navigationItem.leftBarButtonItem = editButtonItem
if let savedMeals = loadMeals() {
if let savedMeals = try! loadMeals() {

This comment has been minimized.

@mono0926

mono0926 Dec 5, 2017

Collaborator

戻り値がOptionalかつthrowsなことに違和感。

使う側も、こういう風にtry!しつつif letでアンラップという不自然な感じに。

FileManager.default.createFile(atPath: pathString, contents: data, attributes: nil)
}
static func retrive<T>(atPath pathString: String) throws -> T? where T: Decodable {

This comment has been minimized.

@mono0926

mono0926 Dec 5, 2017

Collaborator

(atPath pathString: String)

冗長。
(at path: String)が良いはず。

This comment has been minimized.

@hhyyg

hhyyg Dec 5, 2017

Owner

URL型に変更して同時に直しました。

hhyyg added some commits Dec 5, 2017

try! をなるべく減らす
- fileManger -> fm
- ファイルからオブジェクトへの変換(またその逆は)はその時点でエラーで落とす
- ファイルがない場合は、nil を返す
@hhyyg

This comment has been minimized.

Owner

hhyyg commented Dec 5, 2017

@mono0926 修正しました

@mono0926

This comment has been minimized.

Collaborator

mono0926 commented Dec 5, 2017

02_

@hhyyg

This comment has been minimized.

Owner

hhyyg commented Dec 5, 2017

38_

@hhyyg hhyyg merged commit 1d0f1a3 into master Dec 5, 2017

@hhyyg hhyyg deleted the codable branch Dec 5, 2017

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment