假设我有像这样的字符串:
var abc : NSString = "ABC"
Run Code Online (Sandbox Code Playgroud)
我想检查它是否为零,为此我尝试:
if abc == nil{
//TODO:
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用并给我一个错误.错误说:
Can not invoke '=='with an argument list of type '(@|value NSString , NilLiteralConvertible)'
Run Code Online (Sandbox Code Playgroud)
对此有何解决方案?
sap*_*api 62
如果abc是可选的,那么通常的方法是尝试在if语句中解包它:
if let variableName = abc { // If casting, use, eg, if let var = abc as? NSString
// variableName will be abc, unwrapped
} else {
// abc is nil
}
Run Code Online (Sandbox Code Playgroud)
但是,要回答您的实际问题,您的问题是您正在键入变量,使其永远不可选.
请记住,在Swift中,nil这个值只适用于选项.
由于您已将变量声明为:
var abc: NSString ...
Run Code Online (Sandbox Code Playgroud)
它不是可选的,也不可以nil.
尝试将其声明为:
var abc: NSString? ...
Run Code Online (Sandbox Code Playgroud)
或者让编译器推断出类型.
abc == nil当你声明一个var并且想要强制解包然后检查null时,会使用if的情况.在这里你知道这可以nil,你可以检查if != nil使用NSString基础的功能.
如果String?你不知道在运行时包装什么,因此你必须使用if-let并执行检查.
你正在做以下但没有"!".希望这清除它.
从苹果文档看这个:
let assumedString: String! = "An implicitly unwrapped optional string."
Run Code Online (Sandbox Code Playgroud)
您仍然可以将隐式解包的可选项视为普通可选项,以检查它是否包含值:
if assumedString != nil {
println(assumedString)
}
// prints "An implicitly unwrapped optional string."
Run Code Online (Sandbox Code Playgroud)
小智 6
Swift 中的 Guard 关键字确实很好地完成了 null 检查。它提高了代码的可读性,并且在 nil 检查后,如果您想使用变量,它们的范围仍然可用。
func setXYX -> Void{
guard a != nil else {
return;
}
guard b != nil else {
return;
}
print (" a and b is not null");
}
Run Code Online (Sandbox Code Playgroud)
我最后编写了用于零检查的效用函数
func isObjectNotNil(object:AnyObject!) -> Bool
{
if let _:AnyObject = object
{
return true
}
return false
}
Run Code Online (Sandbox Code Playgroud)
相同的工作和代码看起来干净!
用法
var someVar:NSNumber?
if isObjectNotNil(someVar)
{
print("Object is NOT nil")
}
else
{
print("Object is nil")
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
87018 次 |
| 最近记录: |