设为首页 加入收藏

TOP

Swift 与Objective-c语法参照(三)
2015-11-19 23:06:54 来源: 作者: 【 】 浏览:23
Tags:Swift Objective-c 语法 参照
case 2: id = "PE645" name = "iPad Air" price = 499 default:break }
        return (id, name, price)
    }
}


调用:

let store = Store()
let product = store.getProduct(2)
println("id = \(product.id)")
println("name = \(product.name)")
println("price = USD\(product.price)")

10.Optional可选型

10.1可选型

可选型通常用在变量之中,可选型的默认值是nil。如果你给一个非可选型的变量赋值nil会报错:

?var message: String = "Swift is awesome!" // OK
message = nil // compile-time error

当你的类中的属性没有全部初始化的时候会报错:

class Messenger {
    var message1: String = "Swift is awesome!" // OK
    var message2: String // compile-time error
}

在OC中当你给变量赋值为nil或者没有初始化属性的时候,你是不会收到一个编译时错误的:

NSString *message = @"Objective-C will never die!";
message = nil;
class Messenger {
    NSString *message1 = @"Objective will never die!";
    NSString *message2;}

但这不代表你不可以在Swift使用没有初始化的属性,我们可以使用?来表示这是一个可选型的变量:

class Messenger {
    var message1: String = "Swift is awesome!" // OK
    var message2: String? // OK
}

10.2那么我们为什么要用可选型呢?

Swift语言设计的时候有很多安全方面的考虑,可选型表示了Swift是一门类型安全的语言,从上面的例子中你可以看到Swift中的可选型会在编译时就去检查某些可能发生在运行时的错误。

考虑下面的OC中的方法:

- (NSString *)findStockCode:(NSString *)company {
    if ([company isEqualToString:@"Apple"]) {
        return @"AAPL";
    } else if ([company isEqualToString:@"Google"]) {
        return @"GOOG";
    }
return nil; }

这个方法用来判断输入的字符串是不是Apple和Google,如果是其他的话返回nil。

假设我们在类中定义这个方法,并且在类中使用它:

NSString *stockCode = [self findStockCode:@"Facebook"]; // nil is returned
?NSString *text = @"Stock Code - ";
NSString *message = [text stringByAppendingString:stockCode]; // runtime error
NSLog(@"%@", message);


这段代码是可以通过编译的,但是会在运行时发生错误,原因就是方法中传入FaceBook返回了nil。

上面OC中的代码我们在Swift中的话是这样写的:

func findStockCode(company: String) -> String? {
   if (company == "Apple") {
      return "AAPL"
   } else if (company == "Google") {
      return "GOOG"
   }
return nil }
var stockCode:String? = findStockCode("Facebook")
let text = "Stock Code - "
let message = text + stockCode  // compile-time error
println(message)



这段代码不能通过编译,可以避免运行时的错误了。显而易见,可选型的应用可以提高代码的质量。

10.3解包可选型

在上面我们已经看到了可选型的用法,那么我们如何判断一个可选型的变量有值还是为nil呢?

示例:

var stockCode:String? = findStockCode("Facebook")
let text = "Stock Code - "
if stockCode != nil {
    let message = text + stockCode!
    println(message)
}

很像OC中的配对,我们使用if判断语句来做可选型的空值判断。一旦我们知道可选型肯定有值的时候,我们可以使用强制拆封(或者叫解包),也就是在变量名后面加一个感叹号来取得变量的值。

如果我们忘记做空值判断会怎样?你进形了强制拆封所以不会发生编译时错误

var stockCode:String? = findStockCode("Facebook")
let text = "Stock Code - "
let message = text + stockCode!  // runtime error

会发生运行时错误,错误提示:

Can’t unwrap Optional.None


10.4可选绑定

除了强制拆封,可选绑定是一个更简单更好的做法。你使用if - let结构的可选绑定来判断一个变量是不是空值

示例:

var stockCode:String? = findStockCode("Facebook")
let text = "Stock Code - "
if let tempStockCode = stockCode {
    let message = text + tempStockCode
    println(message)
}

if let的意思是如果stockCode有值,那么解包它,并且把它赋给一个临时变量tempStockCode,并且执行下面大括号中(条件块)的代码,否则跳过大括号中的代码。

因为tempStockCode是一个新的常量,你不必再使用!来获取它的值。

你可以简化这个过程:

let text = "Stock Code - "
if var stockCode = findStockCode("Apple") {
    let message = text + stockCode
    println(message)
}

我们把stockCode的定义放到if中,这里stockCode不是可选型,所以在下面的大括号中也不用再使用!如果它是nil,那么大括号中的代码就不会执行。

10.5可选链

我们有一个类Code,里面有两个属性code和price,它们的类型是可选型。把上面示例中的stockCode方法的返回值由String改为返回一个Code类型。

class Stock {
    var code: String?
    var price: Double?
}
func findStockCode(company: String) -> Stock? {
    if (company == "Apple") {
        let aapl: Stock = Stock()
        aapl.code = "AA
首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇linux用c语言获取系统启动时长 下一篇C语言中的errno(错误报告)用法

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: