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 +
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的更多相关文章
- 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 ...
- .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 ...
- 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 ...
- [C++] - GCC和LLVM对方法 warning: non-void function does not return a value [-Wreturn-type] 的处理差异
最近做一个C++开源项目发现一个奇怪问题,通过clang编译链接执行程序每到有一个就崩溃了,gcc下则没有此问题. 后来通过调试,发现原因是bool返回的方法是没有return语句!问题是为啥还能通过 ...
- swift textfiled 输入完毕 return 隐藏键盘 方法
学习swift 真是件头疼的事情 会的人少,又没有OC基础,所以 且学切珍惜吧. 在做登录的时候发现textfiled 自动调用键盘后不能隐藏?头疼 ~~~~询问了好多人 终于有人自写解答 为了方便后 ...
- SWIFT Function
Swift中的函数跟JAVA语言的函数差不多,但也有差别,SWIFT中定义函数可以指定参数的名称这也是别的语言没有的,好处就是增加了可读性.其返回值是放在未尾的,如以下定义一个加法器: func ad ...
- Swift #function 和 _cmd (Objective-C)
NSStringFromSelector(_cmd); // Objective-C print(__FUNCTION__) // Swift 2 print(#function) // Swift ...
- 关于一个function abc() 内 return一个值, 或者多个值写法
1.想return一个值,选第一种写法 function abc(){ a = '我是adad' return a } console.log(abc) // ==> 这个是错的,不要这样写,经 ...
- Function overloading and return type
In C++ and Java, functions can not be overloaded if they differ only in the return type. For example ...
随机推荐
- c#中如何得到百分比数值
//此方法得到的百分比后小数太多,不行double percent=Convert.ToDouble(2)/Convert.ToDouble(34);string result=(percent*10 ...
- [前端 2]常用的JQuery和Dom页面取值与赋值
导读:书到用时方恨少,需要基础知识的时候,才悔恨自己没有总结学习好.前段时间调了好长时间的页面,突然发现自己之前不怎么在意的取值和赋值,真的是自己一个很薄弱的地方,有时候查半天都找不到一个对的,现在用 ...
- CI系统
- Windows phone 8 学习笔记(6) 多任务(转)
Windows phone 8 是一个单任务操作系统,任何时候都只有一个应用处于活跃状态,这里的多任务是指对后台任务的支持.本节我们先讲讲应用程序的运行状态,然后看看支持的后台任务,包括:后台代理.后 ...
- Android IOS WebRTC 音视频开发总结(二八)-- 多人视频方案介绍
很多人问视频会议,在线教学,主播怎么弄,所以整理下这方面的开源解决方案, 同时为了方便测试,在自己服务器上搭建了相应的服务端,文章来自博客园RTC.Blacker,转载请说明出处. 简单来说,WEBR ...
- nginx安装详解
一.环境: 1.Linux:centos6.4(32位) 2.Gcc的编译环境.使用make命令编辑. yum install gcc-c++ 3.PCRE PCRE(Perl Compatible ...
- Show Roles Assigned to a Specific User
Here is a query that I often use to lookup Roles assigned to a specific PeopleSoft user. At run tim ...
- DataGridView取消默认选中行
DataGridView在添加数据后会默认选中第 一个单元格或者第一行,我就想取消它的默认选中行.在DataGridView绑定数据之后加上了ClearSelection().这样一来,不论是启动窗体 ...
- C#关于值类型和引用类型的备忘
值类型 引用类型 内存分配地点 分配在栈中 分配在堆中 效率 效率高,不需要地址转换 效率低,需要进行地址转换 内存回收 使用完后,立即回收 使用完后,不是立即回收,等待GC回收 赋值操作 进行复 ...
- oracle函数和存储过程示例
Function: --为了使产生的uuid符合rfc 4122的标准(http://tools.ietf.org/html/rfc4122),例如:a8f662b8-6e7a-13fe-e040-9 ...