Swift / присвоение нулю строки


Я пишу приложение, используя Parse.com .

func getContactsWithComplition(closure:() -> ())
{
    contactArray=[];
    if (PFUser.currentUser() != nil)
    {
        var realtion: PFRelation=PFUser.currentUser()["contactsOfUser"] as PFRelation;
        var query: PFQuery=realtion.query() as PFQuery;
        query.findObjectsInBackgroundWithBlock({ (contactsArray:[AnyObject]! , error:NSError!) -> Void in
         if(error == nil)
         {

            for aContact in contactsArray
            {
            var cont=contact(phone: aContact["phoneNumber"] as String, firstName: aContact["name"] as String, lastName: aContact["familyName"] as String, adress: aContact["adress"] as String, email: aContact["email"] as String, role: aContact["role"] as String, note: aContact["note"] as String)
                contactArray.append(cont)

            }
            closure()

         }
        else
         {
            println(error);
            }
        })


    }
    else
    {
        println("suck")
    }
}

Когда значение одного из разделов не определено, он возвращает nil, на который нельзя ссылаться как на строку.
Как я могу решить эту проблему?

1 2

1 ответ:

Предполагая, что под разделами вы подразумеваете имя, номер телефона и т. д.

Если вы хотите заменить значение по умолчанию в случае отсутствия значения, вы можете использовать оператор nil-coalescing:

//  assuming empty string is a reasonable substitute
let number = aContact["phoneNumber"] as? String ?? ""

Обратите внимание на ?, используемый с as? - таким образом, если значение никогда не будет строкой, оно будет изящно отказывать (фактически, вы будете вынуждены использовать as Этот способ с Swift 1.2).

Возможно, вам придется повозиться с parens, чтобы исправить приоритет as vs ?? в зависимости от того, какая версия от Свифта ты бежишь.

P. S. Если вы работаете Свифт 1.2, вы могли бы устранить некоторые дополнительные проверки ранее как:

if let user = PFUser.currentUser(),
       relation = user["contactsOfUser"] as? PFRelation,
       query = relation.query() as? PFQuery
{
    query.findObjectsInBackgroundWithBlock { contactsArray, error in
        if let err = error {
            println(err)
        }
        else {
          // etc
        }
    }
}