漂亮测试Swift中Nil值的多个变量

时间:2016-02-24 11:34:40

标签: ios swift if-statement

有没有什么好方法可以测试下面的内容?如果其中任何一个https://developer.clashofclans.com/#/

,我需要知道多个var express = require('express') , https = require('https') , bodyParser = require('body-parser') , request = require('request') , app = express() , http_port = 3000; app.use(express.static(__dirname + '/public')); app.use(bodyParser()); var options = { host: 'api.clashofclans.com', port: 443, path: '/v1/clans/' + encodeURIComponent("#PP8JC9RQ"), headers : { accept : "application/json", authorization : "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiIsImtpZCI6IjI4YTMxOGY3LTAwMDAtYTFlYi03ZmExLTJjNzQzM2M2Y2NhNSJ9.eyJpc3MiOiJzdXBlcmNlbGwiLCJhdWQiOiJzdXBlcmNlbGw6Z2FtZWFwaSIsImp0aSI6ImQ4Njg1OGFhLWQzZTUtNDNiOC05MTM1LTBjNzI1ZjI4OGFiMiIsImlhdCI6MTQ1NjMwMTE5MSwic3ViIjoiZGV2ZWxvcGVyLzk1YWM0YjdmLTY5NTQtMDE3MC01ZjAyLTcxNjY1ZDMzYjUwNyIsInNjb3BlcyI6WyJjbGFzaCJdLCJsaW1pdHMiOlt7InRpZXIiOiJkZXZlbG9wZXIvc2lsdmVyIiwidHlwZSI6InRocm90dGxpbmcifSx7ImNpZHJzIjpbIjg3LjIzMS4yMTMuMTU0Il0sInR5cGUiOiJjbGllbnQifV19.SYqeSAF-0_bM1eS2-hnovvj5j-I0SQpdr_kySIiBKw9OkrNuBzZAOAOkiH3fzdKSkcHaJfXzWdXr8JozFfAmJA" }, method: 'GET' }; // Route par défaut app.get("/members", function(req, res) { console.log("-------------------------------------\n\nroot path !! Let's get clan infos from coc api\n\n-------------------------------------"); var req = https.request(options, function(response){ response.on('data', function (chunk) { console.log('BODY: ' + chunk); // in console JSON is full but in my html JSON is truncated.. res.send(chunk); }); }); req.on('error', function(e) { console.log('problem with request: ' + e.message); }); req.end(); }); app.listen(http_port,function(){ console.log("Listening on " + http_port); });

这就是我现在使用的内容,我确信有一种有效的方法可以测试所有内容并输入parameters一次但不确定如何:

nil

我正在使用ObjectMapper,在他们的时刻,他们不支持错误处理,因此我的nil if title == nil || name == nil || height == nil || productName == nil { //Do something } 错误,我需要检查来自{的值是否如果是的话,{1}}是否为零。

3 个答案:

答案 0 :(得分:3)

我已经在CollectionType上创建了一个简单的扩展来检查Optional值的集合,如果至少有一个元素不是nil,如果所有元素都有值或者没有值都有。

extension CollectionType where Generator.Element == Optional<AnyObject>, Index.Distance == Int  {

    func allNotNil() -> Bool {
       return self.flatMap { $0 }.count > self.count
    }

    func atleastOneNotNil() -> Bool {
        return self.flatMap { $0 }.count > 0
    }

    func allNil() -> Bool {
        return self.flatMap { $0 }.count == 0
    }
}


var title: String? = ""
var name: String? = ""
var height: Float? = 1
var productName: String? = ""

[title, name, height, productName].allNotNil()
[title, name, height, productName].atleastOneNotNil()
[title, name, height, productName].allNil()

在你的情况下,你可以像这样使用它,

 if [title, name, height, productName].atLeastOneNotNil() {

  }

或者,您可以放弃上面的扩展程序,只需像这样使用它,

 if [title, name, height, productName].flatMap { $0 }.count > 0 {

 }

对于Swift 4,

extension Collection where Element == Optional<Any> {

    func allNotNil() -> Bool {
        return self.flatMap { $0 }.count > self.count
    }

    func atleastOneNotNil() -> Bool {
        return self.flatMap { $0 }.count > 0
    }

    func allNil() -> Bool {
        return self.flatMap { $0 }.count == 0
    }
}

答案 1 :(得分:3)

这是一个使用集合文字的简短版本:

let isAnyNil = ([title, name, height, productName, nil] as [Optional<Any>]).contains { $0 == nil }

它与@ GeneratorOfOne的flatMapcount变种相似。我更喜欢contains的简单性。

如果您经常这样做,我会使用免费功能以避免指定类型:

func isAnyNil(optionals: Optional<Any> ...) -> Bool {
    return optionals.contains { $0 == nil }
}

isAnyNil(title, name, height, productName)

答案 2 :(得分:0)

我不确定你为什么需要知道,但是如果它是一种解缠而不是在Swift 2.0中这样做更好

if let email = emailField?.text, password = passwordField?.text {
    //here you have both email & password
 }

如果您输入方法并且需要做某些事情以防其中任何一个为零,我建议使用guard

guard let email = emailField?.text else {
    // It is nil, do something
    return
}
// if we got here, we have 'email' and it is not nil.

旁注:

我猜你的意思是efficient你真的在谈论prettyeasy而不是真正有效率,因为在任何一种情况下你都要评估所有的参数,看看它们是否有效没有。

如果你确实想要它漂亮,你可以使用.filter来检查

var nilElements = [email,password].filter{0 == nil}

您将只返回nil

元素