1

次のような2つの列挙型を含むクラスがあります(単純化):

class Errors {
    enum UserError: String {
        case NoToken = "No token!"
        case NoPassword = "No password!"
    }

    enum BackendError: String {
        case NoConnection = "No connection!"
        case ServerBusy = "Server is busy!"
    }
}

ここで、UserError または BackendError のいずれかを受け入れ、入力に応じて String を返す汎用関数を作成したいと思います。このようなもの:

func alert(type: /* Accepts Error.UserError or BackendError*/) -> String {
    // checks if UserError or BackendError and returns .rawValue
}

私の最初のアプローチはジェネリックを使用することでした - しかし、率直に言って、私はこの概念を理解するのに苦労しており、ここで根本的に間違っている傾向があります. 私がしたことは:

func alert<T>(type: T) {
    if type == Errors.UserError {
        return Errors.UserError.NoPassword.rawValue
    } else {
        return Errors.BackendError.NoConnection.rawValue
    }
 }

明らかに、これは機能しません。

binary operator cannot be applied to operands of type 'T' and 'Errors.UserError.Type'

これは、欠落している Equatable/Comparable プロトコルの実装と、ジェネリックの使用に関する私の一般的な理解不足と関係があることを理解しています。私の質問は次のとおりです。

  1. 一般的な「型」パラメーターを列挙型と比較するにはどうすればよいですか?

  2. ジェネリックに対する私の理解は完全に間違っていますか?

AnyObjectまた、アプローチを避けたいと思います。

4

2 に答える 2

1

あなたenumsが共通して利用したいことは、それらがRawRepresentableそのRawValueタイプの場所にあるということですString

したがって、次のような関数が必要です。

func alert<T: RawRepresentable where T.RawValue == String>(t: T) -> String {
    return t.rawValue
}
于 2016-02-05T11:29:03.357 に答える