条件绑定的初始化程序必须具有可选类型,而不是 swift 3 中的“字符串”

Posted

技术标签:

【中文标题】条件绑定的初始化程序必须具有可选类型,而不是 swift 3 中的“字符串”【英文标题】:Initializer for conditional binding must have Optional type, not 'String' in 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

【问题讨论】:

【参考方案1】:

两个错误:

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

    string(from: 日期总是返回一个非可选的。可选绑定只能用于可选项 您将非可选的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 好吧,如果我们没有生成崩溃的真实代码,那么帮助是非常困难的:) 请检查我的更新部分。

以上是关于条件绑定的初始化程序必须具有可选类型,而不是 swift 3 中的“字符串”的主要内容,如果未能解决你的问题,请参考以下文章

如何修复条件绑定的初始化程序必须具有可选类型,而不是“字符串”? [复制]

条件绑定的初始化程序必须具有可选类型,而不是“UIView”

条件绑定的初始化程序必须具有可选类型,而不是“AVAudioInputNode”

条件绑定的初始化程序必须具有可选类型,而不是“UIView”

收到此错误:条件绑定的初始化程序必须具有可选类型,而不是“布尔”

Swift - 条件绑定的初始化程序必须具有可选类型,而不是 'PHFetchResult<PHAsset>'