[swift-evolution] Compiler should generate code base on the functions that have default values
Félix Cloutier
felixcca at yahoo.ca
Sun Jan 17 11:06:26 CST 2016
I agree that the compiler should be able to use a function with default values for protocol conformance.
Félix
> Le 17 janv. 2016 à 11:52:06, J. Cheyo Jimenez via swift-evolution <swift-evolution at swift.org> a écrit :
>
> This is very interesting. The first case seems like a bug because the compiler should not let you define that function().
>
> Do you have any actual examples when you would need to conform to the same function name but with different signatures?
>
> On Sunday, January 17, 2016, 肇鑫 via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
> This proposal is the summary of the previous protocol function default value proposal and some of my new thinkings all together.
>
> Currently the compiler doesn't stop you defining two functions like:
>
> func printSomething(something:String = "some thing") {
> print(something)
> }
>
> func printSomething() {
> print("some thing!")
> }
>
> However, when you call it, an error arises.
>
> printSomething() // Ambiguous use of 'printSomething'
>
> You may say just remove the function that has no argument. But protocol needs it.
>
> protocol A {
> func printSomething(something:String)
> func printSomething()
> }
>
> struct Foo:A {
> func printSomething(something:String) {
> print(something)
> }
>
> func printSomething() {
> self.printSomething("some thing")
> }
> }
>
> If you do't define the no-argument function in protocol A. You can not use the function by (Foo() as A).printSomething().
>
>
> As we all know, a function with default values, can rewrite to two or more equivalent functions. For example,
>
> struct Bar {
> func add(int1:Int = 1, int2:Int = 2, int3:Int = 3) {
> print(int1 + int2 + int3)
> }
> }
>
> is equivalent to
>
> struct Bar {
> func add(int1:Int, int2:Int, int3:Int) {
> print(int1 + int2 + int3)
> }
>
> func add() {
> self.add(1, int2: 2, int3: 3)
> }
>
> func add(int1:Int) {
> self.add(int1, int2: 2, int3: 3)
> }
>
> func add(int1:Int, int2:Int) {
> self.add(int1, int2: int2, int3: 3)
> }
> }
>
> So my proposal is let compiler or pre-compiler to generate the code internally, without changing the original code, base on the functions that have default values.
>
> Then we need not to define multiple functions in a protocol when we need function with default values.
>
> new code:
>
> protocol A {
> func printSomething(something:String)
> }
>
> struct Foo:A {
> func printSomething(something:String = "some thing") {
> print(something)
> }
> }
>
>
> If we don't want to change our previous code, we may also need to introduce another keyword defaultValue. This keyword is used only in a protocol to restrict if a function's argument can have a default value. If a function use it, but the implementation doesn't give a default value, or vice versa, an error arises.
>
> new code:
>
> protocol A {
> func printSomething(something:String = defaultValue)
> }
>
> struct Foo:A {
> func printSomething(something:String = "some thing") {
> print(something)
> }
> }
>
> This keyword is useful. With it, you can still use Swift in old way. Which means you need not to change code like below if you don't want to.
>
> old code:
>
> protocol A {
> func printSomething(something:String)
> func printSomething()
> }
>
> struct Foo:A {
> func printSomething(something:String) {
> print(something)
> }
>
> func printSomething() {
> self.printSomething("some thing")
> }
> }
>
> But if you want to write new code. You can just write it in the new way, enjoining the simpler and clearer.
>
> zhaoxin
>
>
>
>
>
>
>
>
>
>
>
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160117/b73d7cfd/attachment.html>
More information about the swift-evolution
mailing list