【问题标题】:Initializer for conditional binding must have Optional type, not 'String' in swift 3条件绑定的初始化程序必须具有可选类型,而不是 swift 3 中的“字符串”
【发布时间】:2017-08-19 17:51:24
【问题描述】:

我有这样的方法。

func getFirstDayX(date:Date)->CGFloat
{
   // let date = NSDate()
    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    dateFormatter.dateFormat  = "EEEE"//"EE" to get short style
    guard let dayInWeek = dateFormatter.string(from: (date as? Date)!) else
    {
        return 0.0
    }//"Sunday"
    let dayX:CGFloat!
    print("day in week-------\(dayInWeek)")
    switch dayInWeek {
    case "Monday":
        dayX=0.0
    case "Tuesday":
        dayX=lblDayName.frame.size.width
    case "Wednesday":
        dayX=lblDayName.frame.size.width*2
    case "Thursday":
        dayX=lblDayName.frame.size.width*3
    case "Friday":
        dayX=lblDayName.frame.size.width*4
    case "Saturday":
        dayX=lblDayName.frame.size.width*5
    case "Sunday":
        dayX=lblDayName.frame.size.width*6
    default:
        dayX=0.0
    }

    return dayX
}

但我得到一个错误

条件绑定的初始化器必须是 Optional 类型,而不是 '字符串'

这是什么原因?请帮帮我。

更新

这是我添加语言环境和保护条件之前的方式。请检查一下。

func getFirstDayX(date:Date)->CGFloat
{

let dateFormatter = DateFormatter()

dateFormatter.dateFormat  = "EEEE"//"EE" to get short style
 let dayInWeek = dateFormatter.string(from: date as Date) else

let dayX:CGFloat!
print("day in week-------\(dayInWeek)")
switch dayInWeek {
case "Monday":
    dayX=0.0
case "Tuesday":
    dayX=lblDayName.frame.size.width
case "Wednesday":
    dayX=lblDayName.frame.size.width*2
case "Thursday":
    dayX=lblDayName.frame.size.width*3
case "Friday":
    dayX=lblDayName.frame.size.width*4
case "Saturday":
    dayX=lblDayName.frame.size.width*5
case "Sunday":
    dayX=lblDayName.frame.size.width*6
default:
    dayX=0.0
}

return dayX

}

【问题讨论】:

    标签: ios swift3 dateformatter


    【解决方案1】:

    两个错误:

    guard let dayInWeek = dateFormatter.string(from: (date as? Date)!) else

    1. string(from: 日期总是返回一个非可选的。可选绑定只能用于可选项
    2. 您将非可选的Date 传递给可选的Date 并立即解包是可笑 多余的。

    只要写:

        let dayInWeek = dateFormatter.string(from: date)
    

    【讨论】:

    • 谢谢。实际上,我在看到崩溃报告后怀疑这次崩溃并设置了保护条件。我怀疑这是由于没有为日期格式化程序设置语言环境。因为我之前没有设置。如何设置区域设置以使应用程序适用于设备上的任何区域设置?
    【解决方案2】:

    您的错误已在其他答案中进行了解释。但是,让我提出一个更简单的解决方案,因为使用当天的名称来获取索引只是 silly 太复杂了。您根本不需要日期格式化程序,只需直接询问工作日!

    func getFirstDayX(date: Date) -> CGFloat {
        // Sunday = 0, Monday = 1 ... Saturday = 6
        let weekday = Calendar.current.component(.weekday, from: date)
        // Monday = 0, Tuesday = 1, ... Sunday = 7
        let weekdayIndex = (weekday + 6) % 7
    
        return lblDayName.frame.size.width * weekdayIndex
    }
    

    【讨论】:

      【解决方案3】:

      守卫让...

      当你写作时

      guard let dayInWeek = [OPTIONAL_EXPRESSION] else { return 0.0 }
      

      [OPTIONAL_EXPRESSION] 应该是一个返回可选值的表达式。

      但在你的情况下你确实写了

      dateFormatter.string(from: (date as? Date)!)
      

      它总是返回一个String

      所以没有必要使用guard let 构造。

      而且(date as? Date)!也不需要写

      解决方案

      简单写

      let dayInWeek = dateFormatter.string(from: date)
      

      【讨论】:

      • 谢谢。实际上我之前没有添加保护条件。我用这种方法从用户那里得到了一个崩溃的日志。而且我还没有为日期格式化程序设置任何语言环境。所以我怀疑这次崩溃是由于没有将语言环境设置为日期格式化程序。可以设置此语言环境吗?我应该如何设置语言环境以在任何语言环境设置下运行应用程序?
      • @user1960169 所以这不是导致崩溃的代码吗?
      • 不,当崩溃发生时,我没有添加那个保护条件。我也没有设置语言环境。但是感谢您向我展示了这个问题。它确实帮助我降低了这个问题的复杂性。
      • @user1960169 好吧,如果我们没有生成崩溃的真实代码,那么帮助是非常困难的:)
      • 请检查我的更新部分。
      猜你喜欢
      • 1970-01-01
      • 2018-11-06
      • 2015-12-22
      • 2016-01-29
      • 2018-11-06
      • 1970-01-01
      • 1970-01-01
      • 2018-12-20
      • 2019-03-11
      相关资源
      最近更新 更多