Why Swift compiler cannot infer a type?










0















I've developed this generic method to execute requests:



func executeRequest<T, S, E>(_ request : RequestBuilder<T>,
map: (@escaping (T) -> S)) -> RepositoryResult<S, E> {
return RepositoryResult().doTask result in
request.execute (response, error) in
// do some stuff
result.notifySuccess(value: map(body))




My map function is defined in a subclass with generic types:



class BaseMapper<R, U> 
class func transform(_ dataModel:R) -> U
fatalError("Override this method")

// other generic methods


class HomeMapper:BaseMapper<HomeDTO, Home>
override class func transform(_ dataModel: HomeDTO) -> Home
return Home(customerFirstName: dataModel.customerFirstName,
balance: MoneyMapper.transform(dataModel.balance),
accounts: AccountSummaryMapper.listTransform(dataModel.summaries))




If I call the request executor method passing directly the map function like that:



 func getHomeInfo() -> RepositoryResult<Home, HomeError> 
return executeRequest(HomeAPI.getMyHomeWithRequestBuilder(), map: HomeMapper.transform)



I believe Swift compiler is crashing because it returns several random errors: "Segmentation fault: 11". Otherwise, if I call the method specifying the "S" return type, it works:



func getHomeInfo() -> RepositoryResult<Home, HomeError>
return executeRequest(HomeAPI.getMyHomeWithRequestBuilder(), map: (homeDTO) -> Home in
HomeMapper.transform(homeDTO)
)



Furthermore, using a Mapper that doesn't inherit from BaseMapper and passing the function directly, it also works. Another thing that I don't understand is that RxSwift has a map function that works calling it with my first option...



Why swift compiler cannot infer "S" type? Why swift compiler is crashing and can't tell which line is crashing and why?










share|improve this question



















  • 3





    Compiler crashing means there is a bug in the compiler. To be honest, your object model seems a bit too complicated.

    – Sulthan
    Nov 15 '18 at 8:07






  • 1





    Be sure to file a bugreport with that crash.

    – Gereon
    Nov 15 '18 at 8:47











  • I've just reported the crash

    – Pablo Alonso González
    Nov 15 '18 at 10:29















0















I've developed this generic method to execute requests:



func executeRequest<T, S, E>(_ request : RequestBuilder<T>,
map: (@escaping (T) -> S)) -> RepositoryResult<S, E> {
return RepositoryResult().doTask result in
request.execute (response, error) in
// do some stuff
result.notifySuccess(value: map(body))




My map function is defined in a subclass with generic types:



class BaseMapper<R, U> 
class func transform(_ dataModel:R) -> U
fatalError("Override this method")

// other generic methods


class HomeMapper:BaseMapper<HomeDTO, Home>
override class func transform(_ dataModel: HomeDTO) -> Home
return Home(customerFirstName: dataModel.customerFirstName,
balance: MoneyMapper.transform(dataModel.balance),
accounts: AccountSummaryMapper.listTransform(dataModel.summaries))




If I call the request executor method passing directly the map function like that:



 func getHomeInfo() -> RepositoryResult<Home, HomeError> 
return executeRequest(HomeAPI.getMyHomeWithRequestBuilder(), map: HomeMapper.transform)



I believe Swift compiler is crashing because it returns several random errors: "Segmentation fault: 11". Otherwise, if I call the method specifying the "S" return type, it works:



func getHomeInfo() -> RepositoryResult<Home, HomeError>
return executeRequest(HomeAPI.getMyHomeWithRequestBuilder(), map: (homeDTO) -> Home in
HomeMapper.transform(homeDTO)
)



Furthermore, using a Mapper that doesn't inherit from BaseMapper and passing the function directly, it also works. Another thing that I don't understand is that RxSwift has a map function that works calling it with my first option...



Why swift compiler cannot infer "S" type? Why swift compiler is crashing and can't tell which line is crashing and why?










share|improve this question



















  • 3





    Compiler crashing means there is a bug in the compiler. To be honest, your object model seems a bit too complicated.

    – Sulthan
    Nov 15 '18 at 8:07






  • 1





    Be sure to file a bugreport with that crash.

    – Gereon
    Nov 15 '18 at 8:47











  • I've just reported the crash

    – Pablo Alonso González
    Nov 15 '18 at 10:29













0












0








0








I've developed this generic method to execute requests:



func executeRequest<T, S, E>(_ request : RequestBuilder<T>,
map: (@escaping (T) -> S)) -> RepositoryResult<S, E> {
return RepositoryResult().doTask result in
request.execute (response, error) in
// do some stuff
result.notifySuccess(value: map(body))




My map function is defined in a subclass with generic types:



class BaseMapper<R, U> 
class func transform(_ dataModel:R) -> U
fatalError("Override this method")

// other generic methods


class HomeMapper:BaseMapper<HomeDTO, Home>
override class func transform(_ dataModel: HomeDTO) -> Home
return Home(customerFirstName: dataModel.customerFirstName,
balance: MoneyMapper.transform(dataModel.balance),
accounts: AccountSummaryMapper.listTransform(dataModel.summaries))




If I call the request executor method passing directly the map function like that:



 func getHomeInfo() -> RepositoryResult<Home, HomeError> 
return executeRequest(HomeAPI.getMyHomeWithRequestBuilder(), map: HomeMapper.transform)



I believe Swift compiler is crashing because it returns several random errors: "Segmentation fault: 11". Otherwise, if I call the method specifying the "S" return type, it works:



func getHomeInfo() -> RepositoryResult<Home, HomeError>
return executeRequest(HomeAPI.getMyHomeWithRequestBuilder(), map: (homeDTO) -> Home in
HomeMapper.transform(homeDTO)
)



Furthermore, using a Mapper that doesn't inherit from BaseMapper and passing the function directly, it also works. Another thing that I don't understand is that RxSwift has a map function that works calling it with my first option...



Why swift compiler cannot infer "S" type? Why swift compiler is crashing and can't tell which line is crashing and why?










share|improve this question
















I've developed this generic method to execute requests:



func executeRequest<T, S, E>(_ request : RequestBuilder<T>,
map: (@escaping (T) -> S)) -> RepositoryResult<S, E> {
return RepositoryResult().doTask result in
request.execute (response, error) in
// do some stuff
result.notifySuccess(value: map(body))




My map function is defined in a subclass with generic types:



class BaseMapper<R, U> 
class func transform(_ dataModel:R) -> U
fatalError("Override this method")

// other generic methods


class HomeMapper:BaseMapper<HomeDTO, Home>
override class func transform(_ dataModel: HomeDTO) -> Home
return Home(customerFirstName: dataModel.customerFirstName,
balance: MoneyMapper.transform(dataModel.balance),
accounts: AccountSummaryMapper.listTransform(dataModel.summaries))




If I call the request executor method passing directly the map function like that:



 func getHomeInfo() -> RepositoryResult<Home, HomeError> 
return executeRequest(HomeAPI.getMyHomeWithRequestBuilder(), map: HomeMapper.transform)



I believe Swift compiler is crashing because it returns several random errors: "Segmentation fault: 11". Otherwise, if I call the method specifying the "S" return type, it works:



func getHomeInfo() -> RepositoryResult<Home, HomeError>
return executeRequest(HomeAPI.getMyHomeWithRequestBuilder(), map: (homeDTO) -> Home in
HomeMapper.transform(homeDTO)
)



Furthermore, using a Mapper that doesn't inherit from BaseMapper and passing the function directly, it also works. Another thing that I don't understand is that RxSwift has a map function that works calling it with my first option...



Why swift compiler cannot infer "S" type? Why swift compiler is crashing and can't tell which line is crashing and why?







swift






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 15 '18 at 8:03









cool_jb

396




396










asked Nov 15 '18 at 7:26









Pablo Alonso GonzálezPablo Alonso González

146211




146211







  • 3





    Compiler crashing means there is a bug in the compiler. To be honest, your object model seems a bit too complicated.

    – Sulthan
    Nov 15 '18 at 8:07






  • 1





    Be sure to file a bugreport with that crash.

    – Gereon
    Nov 15 '18 at 8:47











  • I've just reported the crash

    – Pablo Alonso González
    Nov 15 '18 at 10:29












  • 3





    Compiler crashing means there is a bug in the compiler. To be honest, your object model seems a bit too complicated.

    – Sulthan
    Nov 15 '18 at 8:07






  • 1





    Be sure to file a bugreport with that crash.

    – Gereon
    Nov 15 '18 at 8:47











  • I've just reported the crash

    – Pablo Alonso González
    Nov 15 '18 at 10:29







3




3





Compiler crashing means there is a bug in the compiler. To be honest, your object model seems a bit too complicated.

– Sulthan
Nov 15 '18 at 8:07





Compiler crashing means there is a bug in the compiler. To be honest, your object model seems a bit too complicated.

– Sulthan
Nov 15 '18 at 8:07




1




1





Be sure to file a bugreport with that crash.

– Gereon
Nov 15 '18 at 8:47





Be sure to file a bugreport with that crash.

– Gereon
Nov 15 '18 at 8:47













I've just reported the crash

– Pablo Alonso González
Nov 15 '18 at 10:29





I've just reported the crash

– Pablo Alonso González
Nov 15 '18 at 10:29












1 Answer
1






active

oldest

votes


















0














I've found a solution: associatedtypes



protocol Mappable 
associatedtype T
associatedtype S

static func transform(_ dataModel:T) -> S


class MapperHome : Mappable
static func transform(_ dataModel: HomeDTO) -> Home
return Home(customerFirstName: dataModel.customerFirstName,
balance: MoneyMapper.transform(dataModel.balance),
accounts: AccountSummaryMapper.listTransform(dataModel.summaries))



func getHomeInfo() -> RepositoryResult<Home, HomeError>
return executeRequest(HomeAPI.getMyHomeWithRequestBuilder(), map: MapperHome.transform)



I don't understand why this code compiles and using inheritance instance of implementation of a protocol it doesn't... I don't know if it's a compiler bug or my fault.






share|improve this answer























  • A compiler crashing is always the fault of the compiler. It is a major part of its job to not crash even on most convoluted code.

    – GSerg
    Nov 15 '18 at 8:48










Your Answer






StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");

StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);

else
createEditor();

);

function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);



);













draft saved

draft discarded


















StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53314343%2fwhy-swift-compiler-cannot-infer-a-type%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes









0














I've found a solution: associatedtypes



protocol Mappable 
associatedtype T
associatedtype S

static func transform(_ dataModel:T) -> S


class MapperHome : Mappable
static func transform(_ dataModel: HomeDTO) -> Home
return Home(customerFirstName: dataModel.customerFirstName,
balance: MoneyMapper.transform(dataModel.balance),
accounts: AccountSummaryMapper.listTransform(dataModel.summaries))



func getHomeInfo() -> RepositoryResult<Home, HomeError>
return executeRequest(HomeAPI.getMyHomeWithRequestBuilder(), map: MapperHome.transform)



I don't understand why this code compiles and using inheritance instance of implementation of a protocol it doesn't... I don't know if it's a compiler bug or my fault.






share|improve this answer























  • A compiler crashing is always the fault of the compiler. It is a major part of its job to not crash even on most convoluted code.

    – GSerg
    Nov 15 '18 at 8:48















0














I've found a solution: associatedtypes



protocol Mappable 
associatedtype T
associatedtype S

static func transform(_ dataModel:T) -> S


class MapperHome : Mappable
static func transform(_ dataModel: HomeDTO) -> Home
return Home(customerFirstName: dataModel.customerFirstName,
balance: MoneyMapper.transform(dataModel.balance),
accounts: AccountSummaryMapper.listTransform(dataModel.summaries))



func getHomeInfo() -> RepositoryResult<Home, HomeError>
return executeRequest(HomeAPI.getMyHomeWithRequestBuilder(), map: MapperHome.transform)



I don't understand why this code compiles and using inheritance instance of implementation of a protocol it doesn't... I don't know if it's a compiler bug or my fault.






share|improve this answer























  • A compiler crashing is always the fault of the compiler. It is a major part of its job to not crash even on most convoluted code.

    – GSerg
    Nov 15 '18 at 8:48













0












0








0







I've found a solution: associatedtypes



protocol Mappable 
associatedtype T
associatedtype S

static func transform(_ dataModel:T) -> S


class MapperHome : Mappable
static func transform(_ dataModel: HomeDTO) -> Home
return Home(customerFirstName: dataModel.customerFirstName,
balance: MoneyMapper.transform(dataModel.balance),
accounts: AccountSummaryMapper.listTransform(dataModel.summaries))



func getHomeInfo() -> RepositoryResult<Home, HomeError>
return executeRequest(HomeAPI.getMyHomeWithRequestBuilder(), map: MapperHome.transform)



I don't understand why this code compiles and using inheritance instance of implementation of a protocol it doesn't... I don't know if it's a compiler bug or my fault.






share|improve this answer













I've found a solution: associatedtypes



protocol Mappable 
associatedtype T
associatedtype S

static func transform(_ dataModel:T) -> S


class MapperHome : Mappable
static func transform(_ dataModel: HomeDTO) -> Home
return Home(customerFirstName: dataModel.customerFirstName,
balance: MoneyMapper.transform(dataModel.balance),
accounts: AccountSummaryMapper.listTransform(dataModel.summaries))



func getHomeInfo() -> RepositoryResult<Home, HomeError>
return executeRequest(HomeAPI.getMyHomeWithRequestBuilder(), map: MapperHome.transform)



I don't understand why this code compiles and using inheritance instance of implementation of a protocol it doesn't... I don't know if it's a compiler bug or my fault.







share|improve this answer












share|improve this answer



share|improve this answer










answered Nov 15 '18 at 8:41









Pablo Alonso GonzálezPablo Alonso González

146211




146211












  • A compiler crashing is always the fault of the compiler. It is a major part of its job to not crash even on most convoluted code.

    – GSerg
    Nov 15 '18 at 8:48

















  • A compiler crashing is always the fault of the compiler. It is a major part of its job to not crash even on most convoluted code.

    – GSerg
    Nov 15 '18 at 8:48
















A compiler crashing is always the fault of the compiler. It is a major part of its job to not crash even on most convoluted code.

– GSerg
Nov 15 '18 at 8:48





A compiler crashing is always the fault of the compiler. It is a major part of its job to not crash even on most convoluted code.

– GSerg
Nov 15 '18 at 8:48



















draft saved

draft discarded
















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid


  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53314343%2fwhy-swift-compiler-cannot-infer-a-type%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







這個網誌中的熱門文章

Barbados

How to read a connectionString WITH PROVIDER in .NET Core?

Node.js Script on GitHub Pages or Amazon S3