我发现使用let来验证变量是否为nil或之前是否设置了值是非常混乱的。
\s*
有一个表单,用户可以设置他们的生日,并为此变量分配一个值。
稍后在doSave方法中,我想验证此字段是否已填充
declare @idToDelete varchar(max) = '10'
declare @sql nvarchar(max) = ''
set @sql =
(
select 'delete ' + object_name(c.object_id) + ' where id = ' + @idToDelete + char(10)
from sys.columns c
join sys.objects o on o.object_id = c.object_id
join sys.schemas s on s.schema_id = o.schema_id
and s.name = 'dbo'
where c.name = 'id'
for xml path('')
)
print @sql
exec sp_executesql @sql
我获得的最佳方法是根据another related question
创建第二个变量var birthDate: NSDate?
我只收到警告:从'NSDate'到'NSDate'的有条件演员总是成功
这是实现这一目标的唯一方法吗?有什么不那么混乱吗?
答案 0 :(得分:4)
var birthDate: NSDate?
if let birthDate = birthDate {
println(birthDate.descriptionWithLocale(NSLocale.currentLocale())!)
} else {
println("birthDate is nil")
}
birthDate = NSDate()
if let birthDate = birthDate {
println(birthDate.descriptionWithLocale(NSLocale.currentLocale())!)
} else {
println("birthDate is nil")
}
答案 1 :(得分:1)
在此您没有进行检查:
if let bd = birthDate! as? NSDate { ... continue save ... }
else { doAlert("You need to specify your birth date") }
您要做的是将生日更换为NSDate
,您正在做的是强制NSDate?
转为NSDate
,然后您正在检查是否NSDate
}是NSDate
(它始终是,警告来自此处)。如果是,则将其置于变量bd
。
写得很久,你这样做了:
// force unwrap birthdate: birthDate!
if birthDate == nil {
// this crashes the program
} else {
if birthDate! is NSDate { // birthDate as? NSDate
let bd = birthDate as! NSDate
// Here ... continue save ... occurs
} else {
doAlert("You need to specify your birth date")
}
}
正如您所看到的,您首先强制解包,然后检查它是否存在。
您应该使用if let
- 语法:
if let bd = birthDate {
// continue save
} else {
doAlert("You need to specify your birth date")
}
这转换为以下代码:
if birthDate != nil { // birthDate as? NSDate
let bd = birthDate!
// Continue save
} else {
doAlert("You need to specify your birth date")
}
答案 2 :(得分:0)
您可以替换
if let bd = birthDate! as? NSDate
与
if birthDate != nil