【问题标题】:expression pattern of type 'CountableClosedRange<Int>' cannot match values of type 'Int'?“CountableClosedRange<Int>”类型的表达式模式不能匹配“Int”类型的值?
【发布时间】:2016-10-20 20:12:01
【问题描述】:

在 Swift 3 之前的某个时间点,这段代码可以在没有任何编译错误的情况下运行,但是在转换为 Swift 3 之后,这段代码无法编译,我不完全理解值类型有何不同。

给出的错误是 expression pattern of type 'CountableClosedRange&lt;Int&gt;' cannot match values of type 'Int' 对于我尝试在 switch 语句中使用不同范围的值的 switch 情况:

switch hour {
        case 0 ... 11:
            greetingStatement.text = "Good Morning"
        case 12 ... 24:
            greetingStatement.text = "Good Evening"
        default:
            greetingStatement.text = "Hello"
        }

这里是完整的代码:

import UIKit

class ViewController: UIViewController {


    @IBOutlet weak var userInput: UITextField!
    @IBOutlet weak var usertOutput: UILabel!

    @IBOutlet weak var tapMeAfterEnteringYourName: UIButton!

    @IBOutlet weak var greetingStatement: UILabel!
    @IBOutlet weak var letsGetStartedLabel: UILabel!

    @IBOutlet weak var ballonsImageView: UIImageView!
    @IBOutlet weak var teacherPointingToBoardImage: UIImageView!
    @IBAction func setOutput(_ sender: AnyObject){
        greetingStatement.isHidden = false
        usertOutput.text=userInput.text
        tapMeAfterEnteringYourName.isHidden = true
        userInput.isHidden = true
        letsGetStartedLabel.isHidden = false
        ballonsImageView.isHidden = false

        let date = Date()
        let calendar = Calendar.current
        let components = (calendar as NSCalendar).components([.hour], from: date)
        let hour = components.hour
        switch hour {
        case 0 ... 11:
            greetingStatement.text = "Good Morning"
        case 12 ... 24:
            greetingStatement.text = "Good Evening"
        default:
            greetingStatement.text = "Hello"
        }
        view.backgroundColor = UIColor.magenta
        teacherPointingToBoardImage.isHidden=true

        var timer = Timer.scheduledTimer(timeInterval: 1.4, target: self, selector: #selector(ViewController.updateViewController), userInfo: nil, repeats: false)


        let hover = CABasicAnimation(keyPath: "position")
        hover.isAdditive = true
        hover.fromValue = NSValue(cgPoint: CGPoint.zero)
        hover.toValue = NSValue(cgPoint: CGPoint(x: 0.0, y: -100.0))
        hover.autoreverses = true
        hover.duration = 5
        hover.repeatCount = Float.infinity
        ballonsImageView.layer.add(hover, forKey: "myHoverAnimation")



    }

    func updateViewController() {

        print("Timer just fired")
        let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
        let resultViewController = storyBoard.instantiateViewController(withIdentifier: "MadLibOneViewController") as! MadLibOneViewController
        self.present(resultViewController, animated:true, completion:nil)

    }

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor=UIColor.purple
        usertOutput.textColor=UIColor.white
        userInput.textColor = UIColor.purple
        greetingStatement.isHidden = true
        letsGetStartedLabel.isHidden = true
        ballonsImageView.isHidden = true







    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }


}

有人可以澄清这只是一个泛型,其中任何类型的 Int 都是允许或预期的?

【问题讨论】:

    标签: ios swift xcode swift3


    【解决方案1】:

    该错误具有误导性。问题是hour 是可选的Int

    我会将代码更改为:

    if let hour = components.hour {
        switch hour {
        case 0 ... 11:
            greetingStatement.text = "Good Morning"
        case 12 ... 24:
            greetingStatement.text = "Good Evening"
        default:
            greetingStatement.text = "Hello"
        }
    }
    

    【讨论】:

    • 这是一个示例,您可以安全地强制解开可选项,因为您上面的一行明确获得了 hour 组件。
    • @vadian 你是什么意思?在哪里?什么线?请记住,components.hour 返回的是 Int?,而不是 Int
    • 是的,但总有一个值。 components([.hour] 从像 Date() 这样的有效日期开始,永远不会返回 nil
    • @vadian 也许。但它的类型是Int?,所以安全展开是谨慎的。
    • Int("10") 也是Int?。可以是nil吗?可选属性的原因是使用默认 nil don't care 值初始化 DateComponents 更方便和更短。
    【解决方案2】:

    或者使用 API 返回单个非可选值

    let hour = calendar.component(.hour, from: date)
    switch hour { ...
    

    顺便说一句,components:from 在 Swift 3 中已重命名为 dateComponents:from。这样可以避免额外的桥接。

    【讨论】:

      猜你喜欢
      • 2017-11-22
      • 1970-01-01
      • 2016-03-02
      • 2018-07-15
      • 2022-08-05
      • 1970-01-01
      • 1970-01-01
      • 2019-04-06
      • 1970-01-01
      相关资源
      最近更新 更多