Swift 基础3

十. 可选类型

1.可选类型的介绍

  • 注意:

    • 可选类型时swift中非常难理解的一个知识点
    • 暂时先了解,多利用Xcode的提示来使用
    • 随着学习的深入,慢慢理解其中的原理和好处
  • 概念:
    • 在OC开发中,如果一个变量暂停不使用,可以赋值为0(基本属性类型)或者赋值为空(对象类型)
    • 在swift开发中,nil也是一个特殊的类型.因为和真实的类型不匹配是不能赋值的(swift是强语言)
    • 但是开发中赋值nil,在所难免.因此推出了可选类型
  • 可选类型的取值:
    • 空值
    • 有值

2.定义可选类型

  • 定义一个可选类型有两种写法

    • 最基本的写法
    • 语法糖(常用)
// 错误写法

// let string : String = nil

// 正确写法:

// 写法一:定义可选类型

let string : Optional<String> = nil

// 写法二:定义可选类型,语法糖(常用)

let string : String? = nil

3.可选类型的使用

// 演练一:

// 定义可选类型

var string : Optional<String> = nil

// 给可选类型赋值

string = "Hello world"

// 打印结果

    print(string)

// 结果:Optional("Hello world")n

// 因为打印出来的是可选类型,所有会带Optional

// 演练二:

// 取出可选类型的真实值(解包)

    print(string!)

// 结果:Hello worldn

// 注意:如果可选类型为nil,强制取出其中的值(解包),会出错

string = nil

    print(string!) // 报错

// 正确写法:

if string != nil 

    print(string!)
  
}

// 简单写法:为了让在if语句中可以方便使用string

if var str = string 

    print(str)

}

4.真实应用场景

  • 目的:让代码更加严谨
// 通过该方法创建的URL,可能有值,也可能没有值

// 错误写法:如果返回值是nil时,就不能接收了

let url : NSURL = NSURL(string: "www.x.com")

// 正确写法:使用可选类型来接收

let url : NSURL? = NSURL(string: "www.x.com")

// 通过url来创建request对象

if let tempUrl = url 

let request = NSURLRequest(URL: tempUrl)

}

十一. 函数

1.函数的介绍

  • 函数相当于OC中的方法
  • 函数的格式如下
func 函数名(参数列表) -> 返回值类型 

代码块

return 返回值

}
  • func是关键字,多个参数列表之间可以用逗号(,)分隔,也可以没有参数
  • 使用箭头“->”指向返回值类型
  • 如果函数没有返回值,返回值为Void.并且“-> 返回值类型”部分可以省略

2.常见的函数类型

// 1.没有参数,没用返回值

func about() -> Void 

    print("iphone6s plus")

}

// 调用函数

about()

// 简单写法

// 如果没用返回值,Void可以写成()

func about1() -> () 

    print("iphone6s plus")

}

// 如果没有返回值,后面的内容可以都不写

func about2() 

    print("iphone6s plus")

}

about2()

// 2.有参数,没用返回值

func callPhone(phoneNum : String) 

    print("打电话给(phoneNum)")

}

callPhone("+86 11011")

// 3.没用参数,有返回值

func readMessage() -> String 

    return "吃饭了吗?"

}

var str = readMessage()

    print(str)

// 4.有参数,有返回值

func sum(num1 : Int, num2 : Int) -> Int 

    return num1 + num2

}

var result = sum(20, num2: 30)

    print(result)

3.函数的使用注意

  • 注意一: 外部参数和内部参数

    • 在函数内部可以看到的参数,就是内部参数
    • 在函数外面可以看到的参数,就是外部参数
    • 默认情况下,从第二个参数开始,参数名称既是内部参数也是外部参数
    • 如果第一个参数也想要有外部参数,可以设置标签:在变量名前加标签即可
    • 如果不想要外部参数,可以在参数名称前加
// num1和a是外部参数的名称

func ride(num1 num1 : Int, a num2 : Int, b num3 : Int) -> Int 

    return num1 num2 num3

}

var result1 = ride(num1: 20, a: 4, b: 5)

// 方法的重载:方法名称相同,但是参数不同,可以称之为方法的重载(了解)

func ride(num1: Int, num2 :Int) -> Int 

    return num1 num2

}

var result2 = ride(20, 20)
  • 注意二: 默认参数

    • 某些情况,如果没有传入具体的参数,可以使用默认参数
func makecoffee(type :String = "卡布奇诺") -> String 

    return "制作一杯(type)咖啡。"

}

let coffee1 = makecoffee("拿铁")

let coffee2 = makecoffee()
  • 注意三: 可变参数

    • swift中函数的参数个数可以变化,它可以接受不确定数量的输入类型参数
    • 它们必须具有相同的类型
    • 我们可以通过在参数类型名后面加入(...)的方式来指示这是可变参数
func sum(numbers:Double...) -> Double 

var total: Double = 0

for number in numbers 

total += number

}

    return total

}

sum(100.0, 20, 30)

sum(30, 80)
  • 注意四: 引用类型(指针的传递)

    • 默认情况下,函数的参数是值传递.如果想改变外面的变量,则需要传递变量的地址
    • 必须是变量,因为需要在内部改变其值
    • Swift提供的inout关键字就可以实现
    • 对比下列两个函数
// 函数一:值传递

func swap(var a : Int, var b : Int) 

let temp = a;

a = b;

b = temp

    print("a:(a), b:(b)")

}

var a = 10

var b = 20

swap(a, b: b)

    print("a:(a), b:(b)")

// 函数二:指针的传递

func swap1(inout a : Int, inout b : Int) 

let temp = a

a = b

b = temp

    print("a:(a), b:(b)")

}

swap1(&a, b: &b)

    print("a:(a), b:(b)")
  • 函数的嵌套使用

    • swift中函数可以嵌套使用
    • 即函数中包含函数,但是不推荐该写法
// 函数的嵌套

let value = 55

func test() 

func demo() 

    print("demo (value)")

}

    print("test")

demo()

}

demo() // 错误

test()

十二. Swift中类的定义

1.类的介绍

  • Swift也是一门面向对象开发的语言
  • 面向对象的基础是类,类产生了对象
  • 在Swift中如何定义类呢?
    • class是Swift中的关键字,用于定义类
class 类名 : SuperClass 

// 定义属性和方法

}
  • 注意:

    • 定义的类,可以没有父类.那么该类是rootClass
    • 通常情况下,定义类时.继承自NSObject(非OC的NSObject)

2.如何定义类的属性

类的属性介绍
  • Swift中类的属性有多种

    • 存储属性:存储实例的常量和变量
    • 计算属性:通过某种方式计算出来的属性
    • 类属性:与整个类自身相关的属性
  • 存储属性
    • 存储属性是最简单的属性,它作为类实例的一部分,用于存储常量和变量
    • 可以给存储属性提供一个默认值,也可以在初始化方法中对其进行初始化
    • 下面是存储属性的写法
      • age和name都是存储属性,用来记录该学生的年龄和姓名
      • chineseScore和mathScore也是存储属性,用来记录该学生的语文分数和数学分数
class Student : NSObject 

// 定义属性

// 存储属性

var age : Int = 0

var name : String?

var chineseScore : Double = 0.0

var mathScore : Double = 0.0

}

// 创建学生对象

let stu = Student()

// 给存储属性赋值

stu.age = 10

stu.name = "ryan"

stu.chineseScore = 89.0

stu.mathScore = 98.0
  • 计算属性

    • 计算属性并不存储实际的值,而是提供一个getter和一个可选的setter来间接获取和设置其它属性
    • 存储属性一般只提供getter方法
    • 如果只提供getter,而不提供setter,则该计算属性为只读属性,并且可以省略get
    • 下面是计算属性的写法
      • averageScore是计算属性,通过chineseScore和mathScore计算而来的属性
      • 在setter方法中有一个newValue变量,是系统指定分配的
class Student : NSObject 

// 定义属性

// 存储属性

var age : Int = 0

var name : String?

var chineseScore : Double = 0.0

var mathScore : Double = 0.0

// 计算属性

var averageScore : Double 

get 

    return (chineseScore + mathScore) / 2

}

// 没有意义.newValue是系统分配的变量名,内部存储着新值

set 

self.averageScore = newValue

}

}

}

// 获取计算属性的值

      print(stu.averageScore)
  • 类属性

    • 类属性是与类相关联的,而不是与类的实例相关联
    • 所有的类和实例都共有一份类属性.因此在某一处修改之后,该类属性就会被修改
    • 类属性的设置和修改,需要通过类来完成
    • 下面是类属性的写法
      • 类属性使用static来修饰
      • courseCount是类属性,用来记录学生有多少门课程
class Student : NSObject 

// 定义属性

// 存储属性

var age : Int = 0

var name : String?

var chineseScore : Double = 0.0

var mathScore : Double = 0.0

// 计算属性

var averageScore : Double 

get 

    return (chineseScore + mathScore) / 2

}

// 没有意义.newValue是系统分配的变量名,内部存储着新值

set 

self.averageScore = newValue

}

}

// 类属性

static var corseCount : Int = 0

}

// 设置类属性的值

Student.corseCount = 3

// 取出类属性的值

    print(Student.corseCount)
  • 监听属性的改变

    • 在OC中我们可以重写set方法来监听属性的改变
    • Swift中可以通过属性观察者来监听和响应属性值的变化
    • 通常是监听存储属性和类属性的改变.(对于计算属性,我们不需要定义属性观察者,因为我们可以在计算属性的setter中直接观察并响应这种值的变化)
    • 我们通过设置以下观察方法来定义观察者
      • willSet:在属性值被存储之前设置。此时新属性值作为一个常量参数被传入。该参数名默认为newValue,我们可以自己定义该参数名
      • didSet:在新属性值被存储后立即调用。与willSet相同,此时传入的是属性的旧值,默认参数名为oldValue
      • willSet与didSet只有在属性第一次被设置时才会调用,在初始化时,不会去调用这些监听方法
    • 监听的方式如下:
      • 监听age和name的变化
class Person : NSObject 

var name : String? 

// 可以给newValue自定义名称

willSet (new) // 属性即将改变,还未改变时会调用的方法

// 在该方法中有一个默认的系统属性newValue,用于存储新值

    print(name)

    print(new)

}

// 可以给oldValue自定义名称

didSet (old) // 属性值已经改变了,会调用的方法

// 在该方法中有一个默认的系统属性oldValue,用于存储旧值

    print(name)

    print(old)

}

}

var age : Int = 0

var height : Double = 0.0

}

let p : Person = Person()

// 在赋值时,监听该属性的改变

// 在OC中是通过重写set方法

// 在swift中,可以给属性添加监听器

p.name = "ryan"

//p.name = "szy"
时间: 2024-08-05 19:41:03

Swift 基础3的相关文章

从Pitre《Swift 基础教程2nd》开始

看了两天<Learn Objective-C on the MAC> 中文版本<Objective-C基础编程>,大概认真读到了第9章内存管理部分,感觉这语言可比C++简单多了. 第一天,因为有C语言基础的缘故,我在windows 上安装了GNUstep (Objective-C)开发环境,变看电子书籍,边在PC上编译运行树上的示例,几乎一个都没放过,还做了不少笔记. (毕竟作者 Mark Dalrymaple & Scott Knaster 是高屋建瓴,叙述技术娓娓道来,

3.Swift基础知识

Swift是用来开发iOS和OS X应用的新语言,但是许多地方用起来跟C或者OC是差不多的. Swift提供了C语言和OC的基本数据类型,比如整型用Int,浮点型用Double或者Float,布尔型用Bool,字符串文本用String,Swift还提供了两种集合类型,Array和Dictionary,后面会介绍. Swift也跟C一样用唯一的变量名来存储与使用数据,还能使用一些值不会变的变量,应该说是常量,比C里面的常量要强大.在涉及到一些值不会发生变化的数据时使用常量类型能让代码更安全整洁.

随手记Swift基础和Optional Type(问号?和感叹号!)

距离Apple推出Swift已经有几天了,网上也时不时出现"急招Swift程序员,要求有一天工作经验"的帖子. 看到Swift,除了苹果放的另外一门语言的链接(http://swift-lang.org/),还可能联想到Taylor Swift,或者铃木雨燕. 这几天网上关于Swift的话题和材料应该迅速膨胀,比如StackOverflow的相关标签,还有知乎上的一些相关讨论. 关于Swift的推出,我个人觉得对现有的使用Objective-C的iOS开发者不算是很大的冲击,毕竟写代码

Swift基础语法(常量变量、数据类型、元组、可选、断言等)

Swift 是 iOS 和 OS X 应用开发的一门新语言.然而,如果你有 C 或者 Objective-C 开发经验的话,你会发现 Swift 的很多内容都是你熟悉的. Swift 的类型是在 C 和 Objective-C 的基础上提出的,Int是整型:Double和Float是浮点型:Bool是布尔型:String是字符串.Swift 还有两个有用的集合类型,Array和Dictionary,请参考集合类型. 就像 C 语言一样,Swift 使用变量来进行存储并通过变量名来关联值.在 Sw

Swift学习——Swift基础详解(四)

A:小儿编程很不好! B:多半是不爱学,从看英文版开始,让你爱上编程! Type Aliases    类型重定义(typedef) Swift中重定义类型的关键字是typealias,至于怎么用,应该不必多说了,看例子: typealias AudioSample = UInt16 //定义了一个类型名称AudioSample,代表UInt16类型 var maxAmplitudeFound = AudioSample.min // maxAmplitudeFound is now 0 Boo

Swift基础 - - 高德地图实践(一)

高德地图开发需要自己到官网http://lbs.amap.com/console/ 注册一个ak,新建一个swift工程,然后在Info.plist中添加一个NSLocationAlwaysUsageDescription或者NSLocationWhenInUseUsageDescription. 高德地图的库以及依赖库加入到项目里面 需要的库如下截图: 添加头文件 具体的方式见Swift基础--调用第三方OC项目,在Bridging-Header.h中加入如下代码,这样我们就可以调用高德地图相

Swift学习——Swift基础详解(一)

注:由于基础部分在Swift Tour 中已经大体的说明了,所以在详解中不会达到100%的原文释义 Constants and Variables  常量和变量 常量和变量都需要声明名称和类型(作为程序员,这些基础也就不说了),常量一次赋值不能改变,变量的值可以改变 Declaring Constants and Variables   声明常量和变量 常量和变量在使用之前必须要声明,使用let关键字定义常量,var关键字定义变量 下面的例子可以用来定义用户登录的时候最大的尝试次数: let m

Swift学习——Swift基础详解(二)

上节说了没有营养的变量和常量,这玩意,都差不多,自己稍微看下就好了 Integers    整型 整数就是整数了,没有小数,整数有符号(+,-,0)或者无符号(0,+) Swift提供了8,16,32,64位的有符号和无符号的整数,命名使用C的方式,比如,8位无符号的整型UInt8,32位有符号的整型就是Int32 Integer Bounds    整型范围 可以使用min 和 max获取整数类型的最大值和最小值 let minValue = UInt8.min // minValue is

Swift学习——Swift基础详解(三)

小葵花课堂继续开讲 Numeric Literals    数字文本 数字文本有以下几种写法: A decimal number, with no prefix A binary number, with a 0b prefix An octal number, with a 0o prefix A hexadecimal number, with a 0x prefix 十进制数,无前缀:二进制数,0b前缀:八进制数,0o前缀:十六进制数,0x前缀 论数字17的N种表现形式: let deci

Swift学习——Swift基础详解(八)

Assertions    断言 可选可以让你判断值是否存在,你可以在代码中优雅地处理值缺失的情况.然而,在某些情况下,如果值缺失或者值并不满足特定的条件,你的代码可能并不需要继续执行.这时,你可以在你的代码中触发一个断言(assertion)来结束代码运行并通过调试来找到值缺失的原因. Debugging with Assertions    使用断言进行调试 断言会在运行时判断一个逻辑条件是否为true.从字面意思来说,断言"断言"一个条件是否为真.你可以使用断言来保证在运行其他代