条件绑定的初始化程序必须具有可选类型,而不是 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”