女子高生になりたい

はるみちゃんのブログだよ。えへへ。

SwiftのOptionをEither(Result)にするExtension

SwiftのOptionalをResultにするExtension書いたのでメモ。

Resultはこのライブラリを入れてます

github.com

実装

import Result

extension Optional {
    func toResult<E: Error>(error: E) -> Result<Wrapped, E> {
        guard let value = self else {
            return .failure(error)
        }
        return .success(value)
    }
}

テストコード

class OptionalExtensionTests: XCTestCase {
    func testToResult() {
        enum MockError: Error {
            case mock
        }
        let someString: String? = "hoge"
        let expectRight = someString.toResult(error: MockError.mock)
        XCTAssertEqual(expectRight, .success("hoge"))
        
        let noneString: String? = nil
        let expectLeft = noneString.toResult(error: MockError.mock)
        XCTAssertEqual(expectLeft, .failure(MockError.mock))
    }
}

SwiftのOptionは色々足りてない感あるけど、この方(↓)の書いたExtensionと↑を入れとけば大分使いやすくなる、、と思う。

qiita.com

Eitherがないの違和感しかないんだけど、いつか入るんだろうか