Как проверить объект, ноль или нет?
Предположим, что у меня есть String как:
var abc : NSString = "ABC"
и я хочу проверить, что он равен нулю или нет, и для этого я пытаюсь:
if abc == nil{
//TODO:
}
Но это не работает и дает мне ошибку. Ошибка:
Can not invoke '=='with an argument list of type '(@|value NSString , NilLiteralConvertible)'
Любое решение для этого?
Ответы
Ответ 1
Если 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? ...
или, альтернативно, позволяя компилятору вывести тип.
Ответ 2
Случай if abc == nil
используется, когда вы объявляете var и хотите принудительно развернуть, а затем проверьте значение null. Здесь вы знаете, что это может быть 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."
Ответ 3
Я закончил писать функцию полезности для проверки nil
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")
}
Ответ 4
Нулевая проверка действительно выполняется с ключевым словом guard в swift. Это улучшает читаемость кода, а область переменных по-прежнему доступна после проверки нуля, если вы хотите их использовать.
func setXYX -> Void{
guard a != nil else {
return;
}
guard b != nil else {
return;
}
print (" a and b is not null");
}
Ответ 5
if (MyUnknownClassOrType is nil) {
println("No class or object to see here")
}
Apple также рекомендует использовать это, чтобы проверять наличие изношенных и удаленных классов из предыдущих фреймворков.
Вот точная цитата от разработчика Apple:
Да. Если текущая ОС не реализует класс, то метод класса возвращает nil.
Надеюсь, что это поможет:)
Ответ 6
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"
}
}
Эта функция проверяет любой объект и возвращает значение по умолчанию для объекта, если объект недействителен.
Ответ 7
Обычно я просто хочу знать, является ли объект нулевым или нет.
Итак, я использую эту функцию, которая просто возвращает true
, когда введенный объект действителен, и false
, когда его нет.
func isNotNil(someObject: Any?) -> Bool {
if someObject is String {
if (someObject as? String) != nil {
return true
}else {
return false
}
}else if someObject is Array<Any> {
if (someObject as? Array<Any>) != nil {
return true
}else {
return false
}
}else if someObject is Dictionary<AnyHashable, Any> {
if (someObject as? Dictionary<String, Any>) != nil {
return true
}else {
return false
}
}else if someObject is Data {
if (someObject as? Data) != nil {
return true
}else {
return false
}
}else if someObject is NSNumber {
if (someObject as? NSNumber) != nil{
return true
}else {
return false
}
}else if someObject is UIImage {
if (someObject as? UIImage) != nil {
return true
}else {
return false
}
}
return false
}
Ответ 8
Быстрое короткое выражение:
var abc = "string"
abc != nil ? doWork(abc) : ()
или
abc == nil ? () : abc = "string"
или оба:
abc != nil ? doWork(abc) : abc = "string"
Ответ 9
Swift 4.2
func isValid(_ object:AnyObject!) -> Bool
{
if let _:AnyObject = object
{
return true
}
return false
}
использование
if isValid(selectedPost)
{
savePost()
}
Ответ 10
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 null!")
}else if object is String {
print("Hey, it String!")
}else if object is Int {
print("Hey, it Int!")
}else if object is yourChoice {
print("Hey, it yourChoice!")
}
else {
print("It not null, not String, not yourChoice it \(object)")
}
}