可选类型

By admin in 4858.com on 2019年4月21日

/*

/*

/*

/*

 subscripts(下标): 访问对象中数据的快捷方式

 subscripts(下标): 访问对象中数据的火速格局

 可选类型:

 可选类型:

 所谓下标脚本语法就是可以由此, 实例[索引值]来走访实例中的数据

 所谓下标脚本语法正是力所能及透过, 实例[索引值]来走访实例中的数据

 可选类型的面目实际上是八个枚举;

 可选类型的本来面目实际上是贰个枚举;

 类似于以前我们访问数字和字典, 其实斯威夫特中的数组和字典正是二个结构体

 类似于以前我们走访数字和字典, 其实斯维夫特中的数组和字典就是3个结构体

 None 没有值

 None 没有值

 

 

 Some 有值

 Some 有值

 Array:      subscript (index: Int) -> T

 Array:      subscript (index: Int) -> T

 格式: Optional<类型> 恐怕在项目后边加上?号

 格式: Optional<类型> 也许在项目后边加上?号

 Dictionary: subscript (key: Key) -> Value?

 Dictionary: subscript (key: Key) -> Value?

 由于可选类型在斯威夫特中历历可见, 全数系统做了那个语法糖, 在项目后边加上?

 由于可选类型在斯威夫特中随处可遇, 全数系统做了那么些语法糖, 在品种前边加上?

 arr[0] == arr.subscript(0)

 arr[0] == arr.subscript(0)

 */

 */

 dict[“key”] == dict.subscript(“key”)

 dict[“key”] == dict.subscript(“key”)

 

 

 */

 */

var opa: Optional<Int>

var opa: Optional<Int>

 

 

var opb: Int?

var opb: Int?

struct Student {

struct Student {

 

 

    var name: String = “HaRi”

    var name: String = “HaRi”

//基本类型变量, 在行使在此以前务必开始展览开端化, 不然报错;

//基本项目变量, 在运用从前必须开始展览先导化, 不然报错;

    var math: Double = 98.0

    var math: Double = 98.0

//目标: 安全, 不管如曾几何时候方法都以有意义的;

//目的: 安全, 不管如什么时候候方法都以有意义的;

    var chinese: Double = 99.0

    var chinese: Double = 99.0

//普通变量和可选类型的区分, 普通变量只有一种情景, 有值;

//普通变量和可选类型的区分, 普通变量只有一种景况, 有值;

    var english: Double = 100.0

    var english: Double = 100.0

//注意: Swift中的变量和 OC/C 的不雷同, OC/C可以未有值, 是2个随机值;

//注意: 斯维夫特中的变量和 OC/C 的不均等, OC/C能够未有值, 是一个随机值;

    

    

var nora: Int

var nora: Int

    func score(course: String) -> Double

    func score(course: String) -> Double

nora = 10

nora = 10

    {

    {

print(nora)

print(nora)

        switch course {

        switch course {

 

 

        case “math”:

        case “math”:

//Int *p

//Int *p

            return math

            return math

//NSLog(“%d”, *p)   Error!

//NSLog(“%d”, *p)   Error!

        case “chinese”:

        case “chinese”:

 

 

            return chinese

            return chinese

//由于通常变量只有壹种情况, 有局限性, 所以斯维夫特设计了可选类型

//由于平日变量唯有壹种意况, 有局限性, 所以Swift设计了可选类型

        case “english”:

        case “english”:

print(opb as Any)

print(opb as Any)

            return english

            return english

 

 

        default:

        default:

//可选类型安全呢? 安全! 能够通过可选绑定判别后再利用;

//可选类型安全啊? 安全可选类型。! 能够经过可选绑定判定后再使用;

            return math + chinese + english //
此处待研商为什么再次回到nil就会爆红

            return math + chinese + english //
此处待商量为啥再次回到nil就会爆红

//斯威夫特的发明者出于安全的勘查, 当大家运用基本项目时完全不用考虑是还是不是有值;

//斯威夫特的发明者出于安全的勘察, 当我们使用基本类型时完全不用思量是或不是有值;

        }

        }

//当大家使用可选类型时, 总会记得先判别再利用,
让程序时刻理解怎么有值什么未有值.

//当大家应用可选类型时, 总会记得先推断再选用,
让程序时刻驾驭哪些有值什么未有值.

    }

    }

opb = 55

opb = 55

    

    

if let b = opb{

if let b = opb{

    //一.要想实现下标访问, 必须兑现subscript方法;

    //一.要想落成下标访问, 必须兑现subscript方法;

    print(b)

    print(b)

    //二.要想经过下标访问, 必须兑现get方法;

    //贰.要想经过下标访问, 必须兑现get方法;

}

}

    //三.要想经过下标赋值, 必须兑现set方法.

    //三.要想经过下标赋值, 必须兑现set方法.

 

 

    subscript(course: String) -> Double?{

    subscript(course: String) -> Double?{

 

 

        get{

        get{

//Swift中的可选类型变量更贴近于OC中的普通变量

//斯维夫特中的可选类型变量更接近于OC中的普通变量

            switch course {

            switch course {

//NSData *data = [NSData
.dataWithContentsOfMappedFile:@”/Users/hanjunqiang/Desktop/Study伊芙ryDay/H5/第3阶段/小说.html”];

//NSData *data = [NSData
.dataWithContentsOfMappedFile:@”/Users/hanjunqiang/Desktop/Study伊芙ryDay/H5/第二阶段/小说.html”];

            case “math”:

            case “math”:

//NSLog(“%@”, data);

//NSLog(“%@”, data);

                return math

                return math

 

 

            case “chinese”:

            case “chinese”:

var data:NSData? = NSData(contentsOfFile:
“/Users/hanjunqiang/Desktop/Study伊芙ryDay/H5/第1阶段/小说.html”)
//测试地址, 换到你自身路线地址文件就可以

var data:NSData? = NSData(contentsOfFile:
“/Users/hanjunqiang/Desktop/Study伊夫ryDay/H5/第1阶段/随笔.html”)
//测试地址, 换到你协和路径地址文件就可以

                return chinese

                return chinese

//print(data as Any)

//print(data as Any)

            case “english”:

            case “english”:

 

 

                return english

                return english

 

 

            default:

            default:

/*

/*

                return math + chinese + english

                return math + chinese + english

 可选链: 通过可选类型的变量来调用相应的性子和方法;

 可选链: 通过可选类型的变量来调用相应的性情和方式;

            }

            }

 可选链的重返值是三个可选值

 可选链的再次回到值是三个可选值

        }

        }

 格式:

 格式:

        set{

        set{

 可选值?.属性

 可选值?.属性

            switch course{

            switch course{

 可选值?.方法

 可选值?.方法

                case “math”:

                case “math”:

 */

 */

                //感觉重返的是可选类型

                //感到重返的是可选类型

 

 

                math = newValue!

                math = newValue!

class Person {

class Person {

                case “chinese”:

                case “chinese”:

    var name:String

    var name:String

                chinese = newValue!

                chinese = newValue!

    init(name:String) {

    init(name:String) {

                case “english”:

                case “english”:

        self.name = name

        self.name = name

                english = newValue!

                english = newValue!

    }

    }

            default:

            default:

    func whoMan() -> String {

    func whoMan() -> String {

                print(“not found”)

                print(“not found”)

        print(“my name is \(self.name)”)

        print(“my name is \(self.name)”)

            }

            }

        return name

        return name

        }

        }

    }

    }

    }

    }

    func show() {

    func show() {

}

}

        print(“\(self.name)”)

        print(“\(self.name)”)

var stu = Student(name: “han”, math: 99.0, chinese: 98.0, english: 57.0)

var stu = Student(name: “han”, math: 99.0, chinese: 98.0, english: 57.0)

    }

    }

print(stu.score(course: “english”))

print(stu.score(course: “english”))

}

}

stu[“math”] = 100.0

stu[“math”] = 100.0

var p0:Person?

var p0:Person?

print(stu[“math”]!)

print(stu[“math”]!)

var p1:Person = Person(name: “hjq”)

var p1:Person = Person(name: “hjq”)

 

 

p1.name = “han”

p1.name = “han”

 

 

p1.show()

p1.show()

/** Swift中是同意多索引的下标的 **/

/** 斯威夫特中是同意多索引的下标的 **/

 

 

struct Mul {

struct Mul {

/** 如何通过可选类型来调用对应的措施和性质? **/

/** 如何通过可选类型来调用对应的格局和质量? **/

    subscript(a: Int, b: Int) -> Int

    subscript(a: Int, b: Int) -> Int

 

 

    {

    {

// 1:通过强制解包;  可是强制解包卓殊危险, 假使可选类型未有值,
会引发运转时不当

// 1:通过强制解包;  不过强制解包极度危急, 假使可选类型未有值,
会引发运营时不当

        return a + b

        return a + b

//p0!.name = “xiaohange”

//p0!.name = “xiaohange”

    }

    }

4858.com ,//p0!.whoMan()

//p0!.whoMan()

}

}

 

 

var m = Mul()

var m = Mul()

// 二:通过可选绑定, 代码繁琐, 但安全

// 二:通过可选绑定, 代码繁琐, 但安全

print(m[10,20])

print(m[10,20])

if let b = p0{

if let b = p0{

 

 

    b.name = “hello Han”

    b.name = “hello Han”

    b.whoMan()

    b.whoMan()

}

}

 

 

// 3.由此可选链, 假诺?号前方变量未有值, 整个可选链会失效

// 三.通过可选链, 假使?号前方变量未有值, 整个可选链会失效

// 尤其从简高效, 有利于使用可选类型

// 特别从简高效, 有利于使用可选类型

p0 = p1

p0 = p1

p0?.name = “hi, HaRi”

p0?.name = “hi, HaRi”

var str:String? = p0?.whoMan()

var str:String? = p0?.whoMan()

 

 

//可选链的回来值会自动包装成3个可选值

//可选链的归来值会自动包装成3个可选值

//因为可选链恐怕失效, 所以重临值可能有值也或者没值,
想要表达有值也许未有纸只好用可选值, 所以重临值会自动包装成三个可选值

//因为可选链恐怕失效, 所以再次来到值大概有值也也许没值,
想要表明有值恐怕没有纸只好用可选值, 所以重返值会自动包装成四个可选值

print(p0?.name as Any)

print(p0?.name as Any)

print(p0?.whoMan() as Any)

print(p0?.whoMan() as Any)

print(p1.name)

print(p1.name)

var a:String? = p0?.name

var a:String? = p0?.name

p0?.name = “haha”

p0?.name = “haha”

var b:String? = p1.name

var b:String? = p1.name

 

 

 

 

/*

/*

 可选链调用下标引索:

 可选链调用下标引索:

 格式: 可选值?[]

 格式: 可选值?[]

 */

 */

struct Student {

struct Student {

    var name:String = “han”

    var name:String = “han”

    var math:Double = 99.0

    var math:Double = 99.0

    var chinese:Double = 100.0

    var chinese:Double = 100.0

    var english:Double = 99.0

    var english:Double = 99.0

    //想要通过下标访问, 必须兑现subscript方法;

    //想要通过下标访问, 必须达成subscript方法;

    //假使想要通过下标访问, 必须达成get方法;

    //如果想要通过下标访问, 必须实现get方法;

    //即便想要通过下标赋值, 必须兑现set方法.

    //如若想要通过下标赋值, 必须兑现set方法.

    subscript(course:String) ->Double?{

    subscript(course:String) ->Double?{

        get{

        get{

            switch course{

            switch course{

                case “math”:

                case “math”:

                return math

                return math

                case “chinese”:

                case “chinese”:

                return chinese

                return chinese

                case “english”:

                case “english”:

                return english

                return english

            default:

            default:

                return nil

                return nil

            }

            }

        }

        }

        set{

        set{

            switch course{

            switch course{

            case “math”:

            case “math”:

                math = newValue!   //重临值可选类型!

                math = newValue!   //再次回到值可选类型!

            case “chinese”:

            case “chinese”:

                chinese = newValue!

                chinese = newValue!

            case “english”:

            case “english”:

                english = newValue!

                english = newValue!

            default:

            default:

                print(“not found”)

                print(“not found”)

            }

            }

        }

        }

    }

    }

}

}

var stu:Student? = Student()

var stu:Student? = Student()

//可选链调用下标引索不需求”.”直接在?号前面加上[]即可

//可选链调用下标引索不须要”.”直接在?号后边加上[]即可

print(stu?[“math”] as Any)

print(stu?[“math”] as Any)

 

 

var arr:Array? = [1,2,3,4]

var arr:Array? = [1,2,3,4]

print(arr?[1] as Any)

print(arr?[1] as Any)

 

 

//利用可选链赋值时, 要注意: 早些版本中不可能选拔可选链赋值

//利用可选链赋值时, 要留意: 早些版本中不可能运用可选链赋值

stu?.name = “hanjunqiang”

stu?.name = “hanjunqiang”

print(stu?.name as Any)

print(stu?.name as Any)

 

 

//利用可选链给下标赋值

//利用可选链给下标赋值

stu?[“chinese”] = 200.0

stu?[“chinese”] = 200.0

print(stu?[“chinese”] as Any)

print(stu?[“chinese”] as Any)

 

 

//推断赋值操作是还是不是中标, 可选链的赋值操作也有重临值

//决断赋值操作是不是中标, 可选链的赋值操作也有重返值

//假若赋值成功会重临1个可选类型, 重临()?约等于Void? 代表成功,
重返nil代表战败

//若是赋值成功会重临三个可选类型, 再次来到()?也正是Void? 代表成功,
重回nil代表失利

//let res1: = stu?.name = “xiaohange”

//let res1: = stu?.name = “xiaohange”

//let res1: ()? = stu?.name = “xiaohange”

//let res1: ()? = stu?.name = “xiaohange”

//let res1: Void? = stu?.name = “xiaohange”

//let res1: Void? = stu?.name = “xiaohange”

//print(res1)

//print(res1)

 

 

stu = nil

stu = nil

let res: Void? = stu?.name = “HaRi”

let res: Void? = stu?.name = “HaRi”

print(res as Any)

print(res as Any)

 

 

 

 

 

 

/*

/*

 多层可选链:

 多层可选链:

 单层: 可选值?.属性

 单层: 可选值?.属性

 多层: 可选值?.属性.属性   或者    可选值?.属性.属性?.属性

 多层: 可选值?.属性.属性   或者    可选值?.属性.属性?.属性

 */

 */

class A {

class A {

    var name:String = “han”

    var name:String = “han”

}

}

class B {

class B {

    var a1:A?

    var a1:A?

}

}

class C {

class C {

    var b1:B?

    var b1:B?

}

}

class D {

class D {

    var c1:C?

    var c1:C?

}

}

var a1 = A()

var a1 = A()

var b1 = B()

var b1 = B()

var c1 = C()

var c1 = C()

var d1 = D()

var d1 = D()

 

 

d1.c1 = c1

d1.c1 = c1

// 通过d直接给b赋值

// 通过d直接给b赋值

// 由于D中的C是可选值, 所以须要在C前边加上?号

// 由于D中的C是可选值, 所以供给在C前边加上?号

d1.c1?.b1?.a1 = a1

d1.c1?.b1?.a1 = a1

 

 

// 通过d直接得到a中的name

// 通过d直接获取a中的name

// 其实只须求在可选值后面加上?号就能够, 假若可选值不存在,
那么前面包车型大巴链接失效

// 其实只要求在可选值后边加上?号就可以, 借使可选值不设有,
那么前边的链接失效

print(d1.c1?.b1?.a1?.name as Any)

print(d1.c1?.b1?.a1?.name as Any)

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有