这两天在学习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 + if(count != ){
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 + if(count != ){
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了,程序正常运行~~

Swift function how to return nil的更多相关文章

  1. console.log((function f(n){return ((n > 1) ? n * f(n-1) : n)})(5))调用解析

    console.log((function f(n){) ? n * f(n-) : n)})()); 5被传入到函数,函数内部三元计算,5 > 1成立,运算结果是5*f(4),二次运算,5*4 ...

  2. .sort(function(a,b){return a-b});

    var points = [40,100,1,5,25,10]; var b= points.sort(function(a,b){return a-b}); console.log(b); 那个fu ...

  3. Flask - 访问返回字典的接口报错:The view function did not return a valid response. The return type must be a string, tuple, Response instance, or WSGI callable, but it was a dict.

    背景 有一个 Flask 项目,然后有一个路由返回的是 dict 通过浏览器访问,结果报错 关键报错信息 TypeError: 'dict' object is not callable The vi ...

  4. [C++] - GCC和LLVM对方法 warning: non-void function does not return a value [-Wreturn-type] 的处理差异

    最近做一个C++开源项目发现一个奇怪问题,通过clang编译链接执行程序每到有一个就崩溃了,gcc下则没有此问题. 后来通过调试,发现原因是bool返回的方法是没有return语句!问题是为啥还能通过 ...

  5. swift textfiled 输入完毕 return 隐藏键盘 方法

    学习swift 真是件头疼的事情 会的人少,又没有OC基础,所以 且学切珍惜吧. 在做登录的时候发现textfiled 自动调用键盘后不能隐藏?头疼 ~~~~询问了好多人 终于有人自写解答 为了方便后 ...

  6. SWIFT Function

    Swift中的函数跟JAVA语言的函数差不多,但也有差别,SWIFT中定义函数可以指定参数的名称这也是别的语言没有的,好处就是增加了可读性.其返回值是放在未尾的,如以下定义一个加法器: func ad ...

  7. Swift #function 和 _cmd (Objective-C)

    NSStringFromSelector(_cmd); // Objective-C print(__FUNCTION__) // Swift 2 print(#function) // Swift ...

  8. 关于一个function abc() 内 return一个值, 或者多个值写法

    1.想return一个值,选第一种写法 function abc(){ a = '我是adad' return a } console.log(abc) // ==> 这个是错的,不要这样写,经 ...

  9. Function overloading and return type

    In C++ and Java, functions can not be overloaded if they differ only in the return type. For example ...

随机推荐

  1. 洛谷P2264 情书

    P2264 情书 88通过 971提交 题目提供者lin_toto 标签字符串 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 yyy快把题目改回来 噫 这题的题目好逗啊... 情书std ...

  2. Android fragment 想activity 传送数据

    fragment可以通过定义 fragment的接口的方法来 想activity传送数据: 而activity则是通过实现 fragment的接口来接收fragment的送来的数据: 1.在fragm ...

  3. libpcap报文解析: ipv4、ipv6(待优化)

    #include <string.h> #include <stdlib.h> #include <pcap.h> #include <netinet/in. ...

  4. Linux命令之type

    1:linux命令可以分为很多类,其中常见得类型: (1):builtin --内置命令 (2):alias --命令别名 (3):file --外部命令 具体有哪些内置命令以及内置命令各个用法: [ ...

  5. Android中SearchView修改字体颜色

    首先获取searchView控件,比如在actionbar上获取: SearchView searchView = (SearchView) menu.findItem(R.id.action_sea ...

  6. Windows和Linux下Mysql 重置root 密码

    Windows系统下一:进入Windows窗口cmd命令行下,停止mysql服务: net stop mysql二:进入mysql的安装目录下,进去bin目录mysqld-nt.exe --skip- ...

  7. Windows2003 IIS开启Gzip网页压缩

    1.单击"开始"-"管理工具"-"Internet 信息服务(IIS)管理器",打开IIS管理器:2.在 "IIS 管理器&quo ...

  8. C#中常见的委托(Func委托、Action委托、Predicate委托)

    今天我要说的是C#中的三种委托方式:Func委托,Action委托,Predicate委托以及这三种委托的常见使用场景. Func,Action,Predicate全面解析 首先来说明Func委托,通 ...

  9. JQuery ajax返回JSON时的处理方式

    最近在使用JQuery的ajax方法时,要求返回的数据为json数据,在处理的过程中遇到下面的几个问题,那就是采用不同的方式来生成json数据的时候,在$.ajax方法中应该是如何来处理的,下面依次来 ...

  10. php5.5新函数array_column

    php5.5新增了一个新的数组函数,感觉挺使用的,低版本的实现按照如下实现 if(!function_exists('array_column')){ function array_column($i ...