On balance I think I prefer result types. Java's fully typed throws and Swift's 
semi-typed throws are fine though. I can't see Swift supporting result types 
because they already have throws. 

-- Howard. 

> On 6 Jul 2017, at 4:27 pm, Tim Wang <shenghai.w...@bigtincan.com> wrote:
> 
> Thanks Howard, it's a good workaround. 
> 
> Do you think it would be better to be part of swift language feature? I wish 
> swift team could consider this :)
> 
>> On Thu, Jul 6, 2017 at 11:04 AM Howard Lovatt <howard.lov...@gmail.com> 
>> wrote:
>> You could use a result type, e.g.:
>> 
>> https://github.com/antitypical/Result
>> 
>> Or roll your own result type.
>> 
>> I think the reason that Swift doesn't support what you want is because of 
>> rethrows. When you declare a method as rethrows it can throw anything 
>> because the closure it is re-throwing can throw anything. They could have 
>> fully typed the rethrows but obviously decided that was not worth it. At 
>> present rethrows is light weight; the compiler generates two versions of the 
>> method, one that throws and one that doesn't. If it was typed then it would 
>> be like a generic method and a version of the method would be required for 
>> each type combination that was actually used.
>> 
>>   -- Howard.
>> 
>>> On 6 July 2017 at 10:38, Tim Wang via swift-users <swift-users@swift.org> 
>>> wrote:
>> 
>>> Hi Swifters,
>>> 
>>> I am wondering if it is possible to specify error types thrown in a 
>>> protocol method. By allowing us to do it and letting the compiler check all 
>>> the implementations of the protocol to make sure only they would only throw 
>>> the specified error types, we only need to catch our error types when 
>>> calling these methods. 
>>> 
>>> For the code below:
>>> 
>>> enum MyError: Error {
>>> 
>>>     case justError
>>> 
>>> }
>>> 
>>> protocol MethodWillThrow {
>>> 
>>>     func testMethod() throws MyError
>>> 
>>> }
>>> 
>>> 
>>> 
>>> extension MethodThrow {
>>> 
>>>     func testMethod() throws {
>>> 
>>>         throw MyError.justError
>>> 
>>>     }
>>> 
>>> }
>>> 
>>> class TestClass: MethodThrow {
>>> 
>>>     func testMethod() throws {
>>> 
>>>         throw MyError.justError
>>> 
>>>     }
>>> 
>>>     func anotherMethod() {
>>> 
>>>         do {
>>> 
>>>             try testMethod()
>>> 
>>>         } catch MyError.justError {
>>> 
>>>             print("my error")
>>> 
>>>         } catch {
>>> 
>>>             print("other error")
>>> 
>>>         }
>>> 
>>>     }
>>> 
>>> }
>>> 
>>> Now we need add this extra default catch to make it compile and work and I 
>>> really want to remove this catch.
>>> 
>>> Please let me know if there is a way to do it and thanks for help in 
>>> advance.
>>> 
>>> Tim Wang
>>> 
>>> 
>> 
>>> _______________________________________________
>>> swift-users mailing list
>>> swift-users@swift.org
>>> https://lists.swift.org/mailman/listinfo/swift-users
>>> 
_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to