2015-10-02 3 views
4

Я хочу развернуть эти 6 необязательных переменных, и если они нулевые, я хочу дать им пустое значение String. Это значит, что я могу отправить эти переменные в массив параметров, отправленный в API.Как сконденсировать разворачивание нескольких опций в Swift?

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

Может ли кто-нибудь помочь мне сконденсировать это или сделать его проще?

if let fbEmail = self.fbEmail { 

    }else{ 
     self.fbEmail = "" 
    } 

    if let fbDob = self.fbDob { 

    }else{ 
     self.fbDob = "" 
    } 

    if let fbGender = self.fbGender { 

    }else{ 
     self.fbGender = "" 
    } 
    if let fbUserIp = self.fbUserIp { 

    }else{ 
     self.fbUserIp = "" 
    } 
    if let fbFacebookId = self.fbFacebookId { 

    }else{ 
     self.fbFacebookId = "" 
    } 
    if let fbFacebookAccessToken = self.fbFacebookAccessToken { 

    }else{ 
     self.fbFacebookAccessToken = "" 
    } 

ответ

4

Вы можете распаковать более одного раза. Но если вы это сделаете, у вас не будет никакого способа узнать, какая из них равна нулю. Вы будете знать только, что некоторые из них ноль или нет.

Помимо этого, все они должны быть дополнительными? Не можете ли вы запустить их со значениями по умолчанию, которые вы даете им, когда они равны нулю?


Отрывки:

Просто избежать проблемы в целом.

// just init with a default value without them being an optional 
var fbEmail : String = "" 
var fbDob : String = "" 

Заменить проверки nil с .isEmpty

var string : String = "" 

string.isEmpty // returns true 

string = "SomeString" 

string.isEmpty // returns false 

Optionals с исходными значениями.

// init wit default values while still optional 
var fbEmail : String? = "" 
var fbDob : String? = "" 

разворачивать более чем по одному за раз.

if let unwrfbEmail = fbEmail, let unwrfbDob = fbDob { 
    // stuff available here 
} else { 
    // handle the error 
} 

guard let unwrfbEmail = fbEmail, let unwrfbDob = fbDob else { 
    // put return/break here and handle the error 
} 
// stuff available here 

Контейнер для всех значений. Они являются опциями, но когда они установлены на ноль, они будут сброшены до значения по умолчанию. Вы также можете объявить их как принудительные разворачиваемые варианты !. Или разверните их все сразу с помощью метода, описанного выше. Очевидно, скопируйте пасту и измените значение didSet на все переменные.

// container stuct that uses didSet to avoid nil and reset to default values 
struct container { 

    var fbEmail : String? = "" { 
     didSet { 
      if fbEmail == nil { 
       fbEmail = "" 
      } 
     } 
    } 
    var fbDob : String? = "" 
    var fbGender : String? = "" 
    var fbUserIp : String? = "" 
    var fbFacebookId : String? = "" 
    var fbFacebookAccessToken : String? = "" 

} 
+0

Согласен; Я думаю, что optionals следует использовать только для переменных, которые не имеют значимого значения по умолчанию для их инициализации, или, иначе, должны иметь возможность отмечать состояние «не задано». –

+0

@NicolasMiari Соглашайтесь полностью, соглашаясь со мной и другими вашими соображениями :) Они могут понадобиться, потому что функция, которая используется для извлечения значения, может вернуть нуль. Использование didSet в этом случае для сброса по умолчанию является хорошим исправлением. –

+0

Это был отличный и всеобъемлющий ответ! Спасибо, Ренке. Я действительно рассмотрел решения, просто объявляя начальное «пустое значение», однако это повлияло бы на другие функции, которые у меня есть, чтобы проверить, является ли эта переменная необязательной или нет. Например, fbEmail является необязательным, и я могу дать ему «» по умолчанию, но тогда функция isEmailExist() будет работать некорректно, потому что будет думать, что пустая строка означает, что письмо существует. Так что, по сути, я не думаю, что какое-либо из этих решений работает :( Ps. Я попробовал «развернуть более 1 за один раз», мне нужно понять, не определены ли некоторые вары:/ – trixmasta

8

Вы можете сделать это ровно 6 строк кода:

self.fbEmail = self.fbEmail ?? "" 
self.fbDob = self.fbDob ?? "" 
self.fbGender = self.fbGender ?? "" 
self.fbUserIp = self.fbUserIp ?? "" 
self.fbFacebookId = self.fbFacebookId ?? "" 
self.fbFacebookAccessToken = self.fbFacebookAccessToken ?? "" 

Edit: что с синтаксисом ??: Это ярлык «если ноль присвоить другое значение»:

let c = a ?? b 

присвоит c = a, если a != nil, в противном случае c = b.

+0

Не могли бы вы объяснить" ?? " синтаксис и что здесь происходит? – trixmasta

+0

После второго чтения вашего кода я не уверен, что вы пытались сделать. Вы хотите назначить пустую строку 'self.fbEmail', когда она равна нулю или пытается присвоить ее значение локальной переменной? –

+0

Я пытаюсь назначить пустую строку self.fbEmail, когда она равна нулю – trixmasta

Смежные вопросы