Swift function how to return nil

  这两天在学习Stanford出品的iOS7的课程,这个课程去年也看过,但是看到第3课就不行了,满篇的OC,把人都搞晕了。这段时间因为要写个iOS的App,正好赶上了Swift问世,所以趁着这股劲继续学习iOS的开发,把网上的一些视频关于Swift的都看过和做过了,然后选择看Stanford出品的这个视频,把里面OC实现的代码用Swift实现一遍自己还是觉得比较有意义的,而且还能补充点iOS系统方面的知识。

  一切本都还顺利,在看到第三课,有段代码遇到点问题

代码如下:

这一段通过牌堆Deck抽取一张牌card,当card为非nil时显示内容,问题就处在card的返回值。

代码1:

var card:Card? = playDec.drawRandomCard()
if card{
    sender.setBackgroundImage(UIImage(named: "cardfront"),
                    forState: UIControlState.Normal)
    sender.setTitle(card!.contents, forState: UIControlState.Normal)
}

下面是如何随机抽取card的过程。

代码2:

    func drawRandomCard() -> Card{
        var randomCard: Card?
        var count = cards.count
        var temp = count + 1
        
        
        if(count != 0){
            println("drawRandomCards------cards.count-\(count)")
            var index:Int = Int(arc4random_uniform(UInt32(count)))
            println("drawRandomCards------arc4random \(index)")
           
            println("drawRandomCard------index-\(index)")
            randomCard  = cards[index]
            cards.removeAtIndex(index)
        }
        return randomCard!
    }

  当count==0的时候,牌堆中没有牌,则函数返回nil,然后就代码1就得到一个nil的card,从而不现实内容。以前写java的时候这样没问题,但是Swift就不行了。因为引入了optional value的概念,此时非要return randomCard! 这个“!”表示randomCard不为空。这不就扯了,我要返回空,你却强制要非空。。

  那肯定有解决方案咯,代码2 的函数模板是 ()->card 这里可以看到,card不是optional value,所以必须为非空,所以想返回空值必须在card后面加个?,表示,可能为空。所以正确的代码是:

代码3:

    func drawRandomCard() -> Card?{
        var randomCard: Card?
        var count = cards.count
        var temp = count + 1
        
        
        if(count != 0){
            println("drawRandomCards------cards.count-\(count)")
            var index:Int = Int(arc4random_uniform(UInt32(count)))
            println("drawRandomCards------arc4random \(index)")
           
            println("drawRandomCard------index-\(index)")
            randomCard  = cards[index]
            cards.removeAtIndex(index)
        }
        return randomCard
    }

这样就OK了,程序正常运行~~