这两天在学习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了,程序正常运行~~