2016-04-27 2 views
1

Я пытаюсь написать инициализатор для моего общего перечисления, который переводит enum Result для Alamofire и преобразует его в мой собственный тип результата. То, что я придумал следующий:Инициализация родового перечня Swift из другого общего перечисления?

public enum Result<Value, Error: ErrorType> { 
    case Success(Value) 
    case Failure(Error) 

    public init(result: Alamofire.Result) { 
     switch(result) { 
     case Alamofire.Result.Success(let val): 
      self = MyFramework.Result.Success(val) 
     case Alamofire.Result.Failure(let err): 
      self = MyFramework.Result.Failure(err) 
     } 
    } 
} 

Однако я бегу в следующее сообщение об ошибке:

Cannot invoke 'Success' with an argument list of type '(Value)' 

ответ

0

Как предлагалось jtbandes, явное указание типов общих аргументов избавляет от ошибки криптовального компилятора. Однако, как только это будет разрешено, я столкнусь с еще более загадочным segfault.

После некоторой игры, удаление ссылки на MyFramework, похоже, разрешает segfault по любой причине. Следующий код компилируется нормально:

public enum Result<Value, Error: ErrorType> { 
    case Success(Value) 
    case Failure(Error) 

    public init(result: Alamofire.Result<Value, Error>) { 
     switch(result) { 
     case Alamofire.Result.Success(let val): 
      self = .Success(val) 
     case Alamofire.Result.Failure(let err): 
      self = .Failure(err) 
     } 
    } 
} 
2

Это, кажется, проблема с тем, как компилятор выводит общие аргументы Alamofire.Result.

Вы можете это исправить, изменив

init(result: Alamofire.Result) { 

в

init(result: Alamofire.Result<Value, Error>) { 

Таким образом, общие аргументы указываются явно (такой же, как и аргументы типа вашего результата).

Я также рекомендую вам file a bug, потому что сообщение об ошибке, которое это дало, было довольно бесполезным.

+0

Явного указания общих аргументов избавляются от странной ошибки компилятора, но решения этого вопроса раскрывает еще страннее Segfault. Поиграв с ним еще немного, кажется, что ссылки на 'MyFramework' - вот что вызывает его. Любые мысли о том, почему это может быть так? Я обобщил свои выводы в своем ответе. – blau

+0

Я не заметил, что когда я тестировал это, но тогда ваш код находится в более сложной среде, чем мой простой тестовый файл. Опять же, я думаю, вы должны найти ошибку на bugs.swift.org, чтобы кто-то мог взглянуть на нее (если это еще не известная проблема). – jtbandes

+0

Будет; Я попытаюсь изолировать проблему до отправки отчета об ошибке. Спасибо за вашу помощь. – blau

Смежные вопросы