您的位置:首页 > 移动开发 > Swift

swift学习记录(Optional)

2015-02-23 14:36 246 查看
对swift语法的陌生主要来源于两个地方,一个是区别于其他语言的语法形式,比如C++中的int i 与swift中的var i:Int;另外一个是语法的功能,swift中的语法功能千奇百怪。从这篇文章开始,主要通过阅读与搜索the swift programing language 来学习,记录学习过程中的陌生点。

Optional 这个知识点,其实是我在上一篇文章中,当我尝试 println(dictionary["threeName"])
时发现输出的结果却是Optional("I am three value"),这让我很差异。完整代码如下:

//6.数据字典创建与调用

var dictionary = ["oneName":"I am one value","twoName":"I
am two value"];
var getTowValue = dictionary["twoName"];

//与lua非常相似的字典语法,可以直接插入

dictionary["threeName"] = "I am three value"

println(dictionary["threeName"])

如果这是lua语言,这输出的无疑是 “I am three value” ,何来的 Optional("I
am three value"),通过在the swift programing language查找,我发现,原来Optional是可选值类型。是为了处理值可能缺失的情况。暗示基本数据类型、对象可能为空,弥补了object-c对空值判断的不足。简单来说就是原来像int这种基本类型是无法为nil的,从而无法判断一个int类型是否为空。不过看了接下来这个可选值衍生出来的东西,我只想说,这实在是一个巨坑,没有lua的方便实用,因为lua的解决方案更加符合逻辑,并不会造成其他麻烦,lua通过把任何类型(包括函数)都可以来判断是否等于nil来判断空值。而swift却需要装包(wrapping),拆包(unwrapping),增加来不必要都麻烦。(如果我在理解上有不足之处,尽情谅解)。

下面具体来看看Optional衍生出来了哪些麻烦东西。

1、如果你需要声明一个int的可选值,你需要 var a:Int? = 5,你需要在类型后面加一个“?”,官方认为这很优雅,但是用老罗的话说,伤疤做的再漂亮,它依然是一道伤疤。

2、你以为只有在声明的时候有问题?,不!当时使用的时候你会发现你还需要unwrapping !例如println(a!)。

3、再告诉你一个不幸的消息,在2中的println(a!)很可能会发生运行时奔溃,因为如果a是空值,是不允许拆包的。所以你需要这样:

var a:Int? = 5
if (a != nil) {
println(a!)
}

4、同时,你会发现a需要不停地拆包,这时另一个伤疤来了:可选绑定(Optional Binding),不管你怎么看,下面这几行是不符合其基本语法的,但是你不要怀疑,它叫可选绑定。在if判断里这么一复制,a居然毫无征兆的拆包成ba了!

if let ba = a {

println(ba)

println(ba +1)

}

5、你以为只要自己使用可选值的时候,多注意一下就行?真相是可选值会像幽灵一样悄悄靠近你。

var dictionary = ["oneName":"I am one value","twoName":"I
am two value"]

println(dictionary["oneName"])

var s1:String = "123"
var sa = s1.toInt()

println(sa)

说了这么多坏东西,下面说点好的,为了符合点正常逻辑,swift还提供了隐式解析可选:

var ya:Int! = 9

println(ya)

println(ya + 1)
ya = nil
if (ya != nil) {

println(ya)
}
ya = 15
if (ya != nil) {

println(ya)
}

嗯,好的,我觉得这下符合逻辑多了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: