Свифт дженерики. Как указать тип выхода? - PullRequest
1 голос
/ 26 марта 2020

У меня есть, например, enum, и я хочу заархивировать то, что каждый enum case может дать мне какой-то другой тип вывода для, скажем, функции. Пример кода:

protocol MyType: Codable {
    var id: String {get set}
}

struct Type1: MyType {
    var id: String
    var name:String
}


struct Type2: MyType {
    var id: String
    var amount: Int
}


enum ReturnType {
    case first, second
    //Option 1
    func getElement() -> MyType {
        switch self {
        case .first:
            return Type1(id: "1", name: "Name")
        case .second:
            return Type2(id: "2", amount: 10)
        }
    }

    //Some crap is here - don't pay attention
    func test<T:MyType>(data: T) -> T {
        return data
    }
}

//Option 2
func getElement(ofType type: ReturnType) -> MyType {
    switch type {
    case .first:
        return Type1(id: "1", name: "Name")
    case .second:
        return Type2(id: "2", amount: 10)
    }
}




let test1 = ReturnType.first.getElement() as! Type1
let test2 = ReturnType.second.getElement()
let test3 = getElement(ofType: .first)

Таким образом, в настоящее время только test1 - это Type1, но test2 и test3 - MyType Я хочу заархивировать строгую типизацию без принудительного ввода с помощью as!

enter image description here

Я пытался сделать это с помощью дженериков, но безуспешно. Есть мысли? Очень признателен! Спасибо!

1 Ответ

0 голосов
/ 26 марта 2020

вы можете сделать следующее:

enum ReturnType {
    case first, second
    //Option 1
    func getElement<T: MyType>() -> T {
        switch self {
        case .first:
            return Type1(id: "1", name: "Name") as! T
        case .second:
            return Type2(id: "2", amount: 10) as! T
        }
    }

}

//Option 2
func getElement<T: MyType>(ofType type: ReturnType) -> T {
    switch type {
    case .first:
        return Type1(id: "1", name: "Name") as! T
    case .second:
        return Type2(id: "2", amount: 10) as! T
    }
}

после этого, когда вы вызываете забаву c, вам просто нужно объявить, какой тип переменной вы хотите:

let test1: Type1 = ReturnType.first.getElement()
let test2: Type2 = ReturnType.second.getElement()
let test3: Type1 = getElement(ofType: .first)

надеюсь, это помогло

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...