/*
可选类型:
可选类型的本质其实是一个枚举;
None 没有值
Some 有值
格式: Optional<类型> 或者在类型后面加上?号
由于可选类型在Swift中随处可见, 所有系统做了这个语法糖, 在类型后面加上?
*/
var opa: Optional<Int>
var opb: Int?
//基本类型变量, 在使用之前必须进行初始化, 否则报错;
//目的: 安全, 不管什么时候方法都是有意义的;
//普通变量和可选类型的区别, 普通变量只有一种状态, 有值;
//注意: Swift中的变量和 OC/C 的不一样, OC/C可以没有值, 是一个随机值;
var nora: Int
nora = 10
print(nora)
//Int *p
//NSLog("%d", *p) Error!
//由于普通变量只有一种状态, 有局限性, 所以Swift设计了可选类型
print(opb as Any)
//可选类型安全吗? 安全! 可以通过可选绑定判断后再使用;
//Swift的发明者出于安全的考量, 当我们使用基本类型时完全不用考虑是否有值;
//当我们使用可选类型时, 总会记得先判断再使用, 让程序时刻了解哪些有值哪些没有值.
opb = 55
if let b = opb{
print(b)
}
//Swift中的可选类型变量更贴近于OC中的普通变量
//NSData *data = [NSData .dataWithContentsOfMappedFile:@"/Users/hanjunqiang/Desktop/StudyEveryDay/H5/第一阶段/小说.html"];
//NSLog("%@", data);
var data:NSData? = NSData(contentsOfFile: "/Users/hanjunqiang/Desktop/StudyEveryDay/H5/第一阶段/小说.html") //测试地址, 换成你自己路径地址文件即可
//print(data as Any)
/*
可选链: 通过可选类型的变量来调用相应的属性和方法;
可选链的返回值是一个可选值
格式:
可选值?.属性
可选值?.方法
*/
class Person {
var name:String
init(name:String) {
self.name = name
}
func whoMan() -> String {
print("my name is \(self.name)")
return name
}
func show() {
print("\(self.name)")
}
}
var p0:Person?
var p1:Person = Person(name: "hjq")
p1.name = "han"
p1.show()
/** 如何通过可选类型来调用对应的方法和属性? **/
// 1:通过强制解包; 但是强制解包非常危险, 如果可选类型没有值, 会引发运行时错误
//p0!.name = "xiaohange"
//p0!.whoMan()
// 2:通过可选绑定, 代码繁琐, 但安全
if let b = p0{
b.name = "hello Han"
b.whoMan()
}
// 3.通过可选链, 如果?号前面变量没有值, 整个可选链会失效
// 更加简洁高效, 有利于使用可选类型
p0 = p1
p0?.name = "hi, HaRi"
var str:String? = p0?.whoMan()
//可选链的返回值会自动包装成一个可选值
//因为可选链可能失效, 所以返回值可能有值也可能没值, 想要表达有值或者没有纸只能用可选值, 所以返回值会自动包装成一个可选值
print(p0?.name as Any)
print(p0?.whoMan() as Any)
print(p1.name)
var a:String? = p0?.name
p0?.name = "haha"
var b:String? = p1.name
/*
可选链调用下标引索:
格式: 可选值?[]
*/
struct Student {
var name:String = "han"
var math:Double = 99.0
var chinese:Double = 100.0
var english:Double = 99.0
//想要通过下标访问, 必须实现subscript方法;
//如果想要通过下标访问, 必须实现get方法;
//如果想要通过下标赋值, 必须实现set方法.
subscript(course:String) ->Double?{
get{
switch course{
case "math":
return math
case "chinese":
return chinese
case "english":
ret