1
1

More than 3 years have passed since last update.

String(describing:) で Any と Enum case を文字列へ

Last updated at Posted at 2019-12-05

マッピンやデバッグやテストで使えそうなので、どんな状況使えそうかメモしときます。

ドキュメント

環境

この記事のコードは

  • Xcode 11.2.1

で実行できます

id のタイプが揺れてる時

id のタイプが雑で取り扱われて、 String か Int になってりすることありますよね。
そしてそれに対してモバイルがわなんとかしたい時使えます

let id1: Any = "1" // String
let id2: Any = 1 // Int

String(describing:) を使えば中身間違えなく String 型に

let stringId1 = String(describing: id1) // "1"
let stringId2 = String(describing: id2) // "1"

で、こういうような書き方はいらなくなるでしょう

// value のタイプは Any 
if let value = value as? String {
    return value
} else if let value = value as? Int {
    return String(value)
} else {
    // ry
}

enum の名前をプリントアウトする

携わってるプロジェクトにこういうようなテストヘルパがあります。

// 定義された enum
enum FruitType: Int {
    // Just put some random numbers over here
    case dragonFruit = 777
    case apple = 988
}
// テストヘルバ
func createActivity(type: FruitType, raw: Int) {
    XCTContext.runActivity(named: "") { _ in
        XCTAssertEqual(raw, type.rawValue)
    }
}
// テストケース
import XCTest
@testable import YourTargetName

class FruitTypeTests: XCTestCase {
    func testDefinitions() {
        XCTContext.runActivity(named: "test definitions of FruitType's cases") { _ in
            createActivity(type: .dragonFruit, raw: 777)
            createActivity(type: .apple, raw: 988)
        }
    }
}

テストヘルパのところ、 name は定義されてないから、テスト結果はこうなってよくわからないレポートになってしまいます:

image.png

rawValue をその name の引数に入れるのも可能なのですが、これはさすがにわかり辛いなのでは。という気持ちはありました。

どうしてもケース名表示したい!

改善したいためヘルパーをこうやって改造してみたら

func createActivity(type: FruitType, raw: Int) {
    let typeName = String(describing: type)
    XCTContext.runActivity(named: "test the raw value of .\(typeName) is \(raw)") { _ in
        XCTAssertEqual(raw, type.rawValue)
    }
}

テストレポートもこうなりました

image.png

締め

とりあえず二つを書いてみました!以上です。

おかしいところ、間違えたところありましたぜひコメント欄へよろしくお願いします。

最後

台湾産のドラゴンフルーツはめっちゃうまいよ!

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