Why Swift compiler cannot infer a type?
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
add a comment |
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
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
add a comment |
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
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
swift
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
add a comment |
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
add a comment |
1 Answer
1
active
oldest
votes
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.
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
add a comment |
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
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
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
add a comment |
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.
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
add a comment |
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.
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.
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
add a comment |
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
add a comment |
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
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