假设我有像:
这样的字符串var abc : NSString = "ABC"
我想检查它是否为零,为此我尝试:
if abc == nil{
//TODO:
}
但这不起作用并给我一个错误。错误说:
Can not invoke '=='with an argument list of type '(@|value NSString , NilLiteralConvertible)'
对此有何解决方案?
答案 0 :(得分:60)
如果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
}
但是,要回答您的实际问题,您的问题是您正在键入变量,使其永远不可选。
请记住,在Swift中,nil
是一个只能应用于选项的值。
因为您已将变量声明为:
var abc: NSString ...
它不是可选的,不能是nil
。
尝试将其声明为:
var abc: NSString? ...
或者让编译器推断出类型。
答案 1 :(得分:8)
当您声明var并希望强制解包然后检查null时,使用if abc == nil
的情况。您知道这可以是nil
,您可以检查if != nil
使用基金会的NSString
函数。
如果是String?
,你不知道运行时包装了什么,因此你必须使用if-let并执行检查。
您正在关注但没有“!”。希望这可以解决它。
从Apple docs看看:
let assumedString: String! = "An implicitly unwrapped optional string."
您仍然可以将隐式解包的可选项视为普通的可选项,以检查它是否包含值:
if assumedString != nil {
println(assumedString)
}
// prints "An implicitly unwrapped optional string."
答案 2 :(得分:5)
我最后编写了用于零检查的效用函数
func isObjectNotNil(object:AnyObject!) -> Bool
{
if let _:AnyObject = object
{
return true
}
return false
}
同样的工作&代码看起来干净!
<强>用法强>
var someVar:NSNumber?
if isObjectNotNil(someVar)
{
print("Object is NOT nil")
}
else
{
print("Object is nil")
}
答案 3 :(得分:2)
if (MyUnknownClassOrType is nil) {
println("No class or object to see here")
}
Apple还建议您使用它来检查先前框架中的折旧和删除类。
以下是Apple开发人员的确切报价:
是。如果当前运行的操作系统没有实现该类,则类方法将返回nil。
希望这会有所帮助:)
答案 4 :(得分:1)
func isObjectValid(someObject: Any?) -> Any? {
if someObject is String {
if let someObject = someObject as? String {
return someObject
}else {
return ""
}
}else if someObject is Array<Any> {
if let someObject = someObject as? Array<Any> {
return someObject
}else {
return []
}
}else if someObject is Dictionary<AnyHashable, Any> {
if let someObject = someObject as? Dictionary<String, Any> {
return someObject
}else {
return [:]
}
}else if someObject is Data {
if let someObject = someObject as? Data {
return someObject
}else {
return Data()
}
}else if someObject is NSNumber {
if let someObject = someObject as? NSNumber{
return someObject
}else {
return NSNumber.init(booleanLiteral: false)
}
}else if someObject is UIImage {
if let someObject = someObject as? UIImage {
return someObject
}else {
return UIImage()
}
}
else {
return "InValid Object"
}
}
如果对象无效,此函数会检查任何类型的对象并返回对象类型的默认值。
答案 5 :(得分:1)
Normally, I just want to know if the object is nil or not.
So i use this function that just returns System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.InvalidOperationException: Client found response content type of 'text/html; charset=UTF-8', but expected 'text/xml'.
when the object entered is valid and true
when its not.
false
答案 6 :(得分:0)
Swift 简短表达:
var abc = "string"
abc != nil ? doWork(abc) : ()
或强>
abc == nil ? () : abc = "string"
或两者:
abc != nil ? doWork(abc) : abc = "string"
答案 7 :(得分:0)
Swift 4.2
func isValid(_ object:AnyObject!) -> Bool
{
if let _:AnyObject = object
{
return true
}
return false
}
用法
if isValid(selectedPost)
{
savePost()
}
答案 8 :(得分:0)
Swift-5非常简单的方法
//MARK:- In my case i have an array so i am checking the object in this
for object in yourArray {
if object is NSNull {
print("Hey, it's null!")
}else if object is String {
print("Hey, it's String!")
}else if object is Int {
print("Hey, it's Int!")
}else if object is yourChoice {
print("Hey, it's yourChoice!")
}
else {
print("It's not null, not String, not yourChoice it's \(object)")
}
}
答案 9 :(得分:0)
快捷键4 您不能将Any与nil进行比较。因为可选参数可以为nil,因此它总是成功。 唯一的方法是将其强制转换为所需的对象,然后将其与nil进行比较。
if (someone as? String) != nil
{
//your code`enter code here`
}