swifter-tips / Public-Issues

Public issues for Swifter-tips book
103 stars 3 forks source link

protocol-composition 引申出来的疑惑 #49

Closed zyg-github closed 8 years ago

zyg-github commented 9 years ago

代码: class C { func bar() -> Int { return 1 }

 func bar() -> String {
    return "Hi"
 }

}

上面的代码 编译是通过 但是调用是有诧异的 不能直接调用

可以像下面这样用: let c1 = C() var s: String = c1.bar() print(s)

像这样代码 只能自己写的时候去避免吗? 还是有其他办法? 有望喵神指点一下?

onevcat commented 9 years ago

因为是不同的返回意味着不同的签名,所以编译是没有问题。但是调用的时候现在会因为冲突而需要指明类型。在 Swift 早期版本中其实是可以直接不加指明地调用的,编译器根据某种规则来推断适合的类型(和调用的版本),但是对于我们开发者来说,这些“规则”是不可见的,也十分危险。现在直接调用不能编译通过其实是很大的进步,可以避免不小心写出错误的代码。

其实..最好不要把方法名弄成一样的,会十分迷惑,应当尽量避免。

zyg-github commented 9 years ago

感觉 编译器是不是要对于 只有返回类型不同的重载 进行限制 ? 嘻嘻 谢谢 喵神~