Swift2.0(15)类型的补充

  • 可选链

之前介绍过可选类型,再来深化一下可选链的概念

如下面的代码,包含的符合关系:人—>宠物—>玩具

class Person {
        var pet:Pet?
    }
    class Pet {
        var name:String
        var favorityToy:Toy?
        init(name:String) {
            self.name = name

}

func playToy() {
            print("Pet \(self.name) play toy")

}

}
    class Toy {
        var name:String
        init(name:String) {
            self.name = name
        }

}

Person的pet属性可以为nil,Pet的属性favorityToy可以为nil,这是有现实意义的

let p1 = Person()

print(p1.pet!.name)

由于p1.pet并没有初始化,故为nil,在执行p1.pet!解封时,程序将崩溃(crash)

可选链的格式:串联要访问的属性且在每个可选属性后增加?

print(p1.pet?.favorityToy?.name)     //nil

可选链的常见应用场景:

a. 可选链访问属性,如上面的代码

b. 可选链访问方法,如:

p1.pet?.playToy()

...

  • 类型的转换

先看三个类:

class Animal {
        var age:Int = 1
    }
    class Dog : Animal {
        var dogName:String?
    }
    class Cat : Animal {
        var catName:String?

}

is 关键字 用于进行类型检查,如:

var p:Animal = Dog()

if p is Dog {
        print("是")
    }
    else {
        print("不是")

}

as 用于继承关系中的向上转型

子类实例引用赋值给父类实例引用;其实直接赋值也是允许的

var d1:Dog = Dog()

var a1:Animal = d1 as Animal

as!/as? 用于继承关系中的向下转型

父类实例引用(引用的父类实例也可能引用子类实例)赋值给子类实例引用

as! 用于转换一定成功的情况(进行了强解封),返回的不是可选类型

as? 用于转换不一定成功的情况,返回的是可选类型

如:

var a1:Animal = Dog()

var d1:Dog? =  a1 as? Dog

print(d1)     //Optional(xxxx.Dog)

if let d2:Dog = a1 as? Dog {

print(d2) //xxxx.Dog

}

AnyObject:表示任意class类型的实例

var a:[AnyObject] = [10, 3.14 ,"hello"]

for var item in a {
        if let a:Int = item as? Int {
            print("整数:\(a)")
        }
        else if let a:Double = item as? Double {
            print("浮点:\(a)")
        }
        else if let a:String = item as? String {
            print("字符串:\(a)")
        }

}

Any:表示任意类型,除了方法类型(函数类型)

var a = [Any]()

a.append(10)
    a.append(3.14)

a.append("hello")

for var item in a {
        if let a:Int = item as? Int {
            print("整数:\(a)")
        }
        else if let a:Double = item as? Double {
            print("浮点:\(a)")
        }
        else if let a:String = item as? String {
            print("字符串:\(a)")
        }

}

  • 类型的嵌套

Swift允许在结构体、枚举、类类型中嵌套定义结构体、枚举、类类型

这样做的好处是:方便组织代码、一定程度上起到了命名空间的作用

如:

class A  {
        var name:String?
        class C {
            var name:String?
            var age:Int?
        }
    }
    class B {
        var name:String?
        class C {
            var height:Double?
        }

}

var p1:A.C = A.C()

var p2:B.C = B.C()

被嵌套的类,使用这种 . 方式表示

时间: 2025-01-31 20:51:53

Swift2.0(15)类型的补充的相关文章

Swift2.0(5)元组类型&数组类型&字典类型

元组类型 元组Tuple用来归纳多个归纳具有任意类型的相关联的值,如: var person = (30, "neusoft") print(person)     // (30, "neusoft") 该元组类型对象person的类型可以认为是:(Int, String) 如果想要获取元组中的某个数据,可以采用以下方式 方式一:可以将其中的数据关联到常量或变量中,如: let (age, name) = person print("age:\(age)

Swift2.0(6)结构体类型&枚举类型

结构体类型 基础数据类型都是结构体,如Int  Float Bool等,是Swift自带的并且作为开发基础供开发者使用 在Swift中,结构体(Struct)和类类型(Class)非常相似,结构体是值类型,类是引用类型. 定义格式: struct 名称 : 协议... { 属性和方法 } 如: struct Sword { var length:Int = 11 var name:String = "hello world" func description() { print(&qu

Swift2.0语言教程之函数的返回值与函数类型

Swift2.0语言教程之函数的返回值与函数类型 Swift2.0中函数的返回值 根据是否具有返回值,函数可以分为无返回值函数和有返回值函数.以下将会对这两种函数类型进行讲解. Swift2.0中具有一个返回值的函数 开发者希望在函数中返回某一数据类型的值,必须要在函数声明定义时为函数设定一个返回的数据类型,并使用return语句进行返回.其中,return语句的一般表示形式如下: return 表达式 其中,表达式可以是符合Swift标准的任意表达式.而具有返回值的函数声明定义形式如下: fu

Swift2.0语言教程之类的方法

Swift2.0语言教程之类的方法 Swift2.0语言的方法 方法其实就是函数,只不过它被定义在了类中.在Swift中,根据被使用的方式不同,方法分为了实例方法和类型方法两种.这两种方法的定义也和Objective-C是不同的.本节依次讲解这两种方法. Swift2.0语言的实例方法 实例方法被定义在类中,但是由类的实例调用.所以,这类方法被称为实例方法.实例方法和函数一样,分为了不带参数和带参数两种.以下依次讲解这两种方法的使用. 1.不带参数的实例方法 不带参数的实例方法定义和函数的是一样

总结swi1.2适配swift2.0遇到的改变

swift1.2适配swift2.0 以下列举的是我在项目中遇到的需要修改的,基本常见的问题就没有罗列了. 1.find函数变成了为indexOf 2.sort变成了sortInPlace 3.sorted变成了sort 4.enumerate(self.tableView.visibleCells)修改为self.tableView.visibleCells.enumerate() 5.Printable 变成了CustomStringConvertible 6.DebugPrintable

Swift2.0语言教程之闭包

Swift2.0语言教程之闭包 Swift2.0语言闭包 闭包是自包含的函数代码块,可以在代码中被传递和使用.Swift中的闭包与C和Objective-C中的代码块(blocks)以及其他一些编程语言中的Lambda函数比较相似.在本章中所讲的函数其实就是特殊的闭包.本节主要讲解关于闭包的基本使用. Swift2.0语言闭包表达式 闭包表达式是一种利用简洁语法构建内联(内联类似与C语言中的宏定义)闭包的方式.以下这个代码是对两个字符串的比较. import Foundation //判断两个字

js 判断 0<15<30返回值是 true

与java不一样,因为js是弱语言 0<15 返回布尔类型 true,表达式变成true<30, js 有默认类型转换机制,表达式true<30 中的true会 转换成number类型 1,从而变成1< 30,就得到true; 总结:一般不要适应,if(0<15<30)这种,一般用&&  或者 || : js中null,NaN,'',undefined,false,0都为false,js中的对象,数值出了0都为true, var x={o:0,p:1,q

swift2.0 UIImagePickerController 拍照 相册 录像

系统 ios9.1 语言swift2.0 在app 里最常用的功能就是多媒体选择,首先我们storyboard 创建一个button 用于触发选择事件 @IBAction func selectImageAction(sender: AnyObject) { } 这时候通常会弹出来一个ActionSheet 上面有拍照 , 相册,录像 和取消 这几项.iOS 8 以后actionsheet 和 alertview 都统一用UIAlertController 方法调用,8.3以前actionshe

Swift2.0初见笔记

Swift2.0 1.简单值 1.使用let来声明常量,常量无法改变(相当于const);使用var来声明变量. var myVariable = 42 myVariable = 50 let myConstant = 42 2.常量或者变量的类型必须和你赋给它们的值一样.然而,你不用明确地声明类型,声明的同时赋值的话,编译器会自动推断类型 let implicitInteger = 70 let implicitDouble = 70.0 let explicitDouble: Double

Swift基础知识入门(基于Swift2.0)

//: Playground - noun: a place where people can play import UIKit // Swift中不需要设置main函数入口,编译器会在全局函数中自动设置程序的入口,在书写Swift代码时,可以不使用";"作为语句的结束标志 var str = "Hello, playground" var str1 = "Hello, LiLe" print("Hello World!")