【初学者求助】关于找不到某重载的错误提示

[复制链接]
274 5
刚开始学swifit,跟着斯坦福大学公开课学的
做一个计算器
代码如下:


import UIKit


class ViewController: UIViewController {


@IBOutlet weak var display: UILabel!


var userIsInTheMiddleOfTypingANumber: Bool = false

var operandStack = [Double]()

var displayValue: Double{
get {
return NSNumberFormatter().numberFromString(display.text!)!.doubleValue
}
set {
display.text = "(newValue)"
userIsInTheMiddleOfTypingANumber = false
}
}

func performOperation(operation: (Double, Double) -> Double) {
if operandStack.count >= 2 {
displayValue = operation(operandStack.removeLast(), operandStack.removeLast())
enter()
}
}

private func performOperation(operation: Double -> Double) {
if operandStack.count >= 1 {
displayValue = operation(operandStack.removeLast())
enter()
}
}

@IBAction func appendDigit(sender: UIButton) {
let digit = sender.currentTitle!


if userIsInTheMiddleOfTypingANumber {
display.text = display.text! + digit
}
else {
display.text = digit
userIsInTheMiddleOfTypingANumber = true
}
}


@IBAction func enter() {
userIsInTheMiddleOfTypingANumber = false
operandStack.append(displayValue)
println("operandStack = (operandStack)")
}

@IBAction func operate(sender: UIButton) {
let operation = sender.currentTitle!

if userIsInTheMiddleOfTypingANumber {
enter()
}

switch operation {
case "×":
// performOperation {$0 * $1}
performOperation(*)
case "÷":
performOperation {$1 / $0}
case "+":
// performOperation {$0 + $1}
performOperation(+)
case "−":
performOperation {$0 - $1}
case "√":
performOperation(sqrt)
default: break
}
}
}


实现乘法计算的时候
这么写没有错误提示:
performOperation(*)


而实现加法计算的时候
同样的写法提示错误
performOperation(+)


错误内容:
Could not find an overload for '+' that accepts the supplied arguments


弄不明白
乘法和加法都是二元运算
为什么乘法这么写没有错误
加法却有错误呢
望大神指教
谢谢!

举报 使用道具

回复

5 个评论

chuyuwunai  新手上路  发表于 2019-1-24 02:35:28  | 显示全部楼层
刚开始学swifit,跟着斯坦福大学公开课学的
做一个计算器
代码如下:


import UIKit


class ViewController: UIViewController {


    @IBOutlet weak var display: UILabel!


    var userIsInTheMiddleOfTypingANumber: Bool = false

    var operandStack = [Double]()

    var displayValue: Double{
        get {
            return NSNumberFormatter().numberFromString(display.text!)!.doubleValue
        }
        set {
            display.text = "(newValue)"
            userIsInTheMiddleOfTypingANumber = false
        }
    }

    func performOperation(operation: (Double, Double) -> Double) {
        if operandStack.count >= 2 {
            displayValue = operation(operandStack.removeLast(), operandStack.removeLast())
            enter()
        }
    }

    private func performOperation(operation: Double -> Double) {
        if operandStack.count >= 1 {
            displayValue = operation(operandStack.removeLast())
            enter()
        }
    }

    @IBAction func appendDigit(sender: UIButton) {
        let digit = sender.currentTitle!


        if userIsInTheMiddleOfTypingANumber {
            display.text = display.text! + digit
        }
        else {
            display.text = digit
            userIsInTheMiddleOfTypingANumber = true
        }
    }


    @IBAction func enter() {
        userIsInTheMiddleOfTypingANumber = false
        operandStack.append(displayValue)
        println("operandStack = (operandStack)")
    }

    @IBAction func operate(sender: UIButton) {
        let operation = sender.currentTitle!

        if userIsInTheMiddleOfTypingANumber {
            enter()
        }

        switch operation {
            case "×":
//                performOperation {$0 * $1}
                performOperation(*)
            case "÷":
                performOperation {$1 / $0}
            case "+":
//                performOperation {$0 + $1}
                performOperation(+)
            case "−":
                performOperation {$0 - $1}
            case "√":
                performOperation(sqrt)
            default: break
        }
    }
}


实现乘法计算的时候
这么写没有错误提示:
performOperation(*)


而实现加法计算的时候
同样的写法提示错误
performOperation(+)


错误内容:
Could not find an overload for '+' that accepts the supplied arguments


弄不明白
乘法和加法都是二元运算
为什么乘法这么写没有错误
加法却有错误呢
望大神指教
谢谢!

举报 使用道具

回复
PobaniLiend  新手上路  发表于 2019-1-24 03:28:55  | 显示全部楼层
很明显performOperation 中的operation 接收的是一个闭包,你传递的是一个操作符,能不报错吗

举报 使用道具

回复
wworks  新手上路  发表于 2019-1-24 04:29:30  | 显示全部楼层
为什么乘法的不报错,加法的报错呢?

举报 使用道具

回复
yzzzz  新手上路  发表于 2019-1-24 04:41:49  | 显示全部楼层
引用 2 楼 y0o0ng 的回复:
为什么乘法的不报错,加法的报错呢?

performOperation {$1 / $0} 像这样的写是没有问题的,这是一个挂尾闭包
即使+ 也不报错,在编译时也会报另外的一个错误。你的controller 继承自UIViewController ,这是oc的类。 那么在oc中是不允许出现同名的方法
func performOperation(operation: Double -> Double)
func performOperation(operation: (Double, Double) -> Double)
在oc 下它们的Selector 都是 @selector(performOperation:) ,编译时无法区分。

举报 使用道具

回复
worigeqiu  新手上路  发表于 2019-1-24 05:11:42  | 显示全部楼层
引用 3 楼 zhanglei5415 的回复:
Quote: 引用 2 楼 y0o0ng 的回复:

为什么乘法的不报错,加法的报错呢?

performOperation {$1 / $0} 像这样的写是没有问题的,这是一个挂尾闭包
即使+ 也不报错,在编译时也会报另外的一个错误。你的controller 继承自UIViewController ,这是oc的类。 那么在oc中是不允许出现同名的方法
func performOperation(operation: Double -> Double)
func performOperation(operation: (Double, Double) -> Double)
在oc 下它们的Selector 都是 @selector(performOperation:) ,编译时无法区分。



大神说的这个问题我也碰到了
然后我是通过把其中一元运算的函数变为private来解决的
主贴里的贴代码里是这么写的

func performOperation(operation: (Double, Double) -> Double) {
      //省略
    }

private func performOperation(operation: Double -> Double) {
      //省略
}

现在的Xcode中的错误提示就提示在那个加号的地方了
乘法运算和加法运算都是二元运算符
也不需要像除法或者减法那样需要区分除数减数啥的
加法却有错误
百思不得其解

举报 使用道具

回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

ios.irunthink.com
搜索
热搜: iOS swift 下拉刷新

图文热点

更多

开发教程

更多

客服中心

400-800 周一至周日 9:30-17:30 仅收市话费

关注我们

  • 微信扫描
  • 关注微信
关于我们
关于我们
友情链接
联系我们
帮助中心
精贴推荐
源码上传
注册登录
服务支持
资源下载
关注我们
官方微博
官方空间
快速回复 返回顶部 返回列表