Swift教程(一)--基础内容

2019-07-31 09:44:07 浏览数 (1)

本次的教程是基于Swift5.1版本

Swift是一个全新的用户iOS,MacOS,watchOS和tvOS的应用编程语言。如果你有C和Objective-C开发经验的话,Swift的许多部门会让你很熟悉。

Swift 为所有 C 和 Objective-C 的类型提供了自己的版本,包括整型值的 Int ,浮点数值的 Double 和 Float ,布尔量值的 Bool ,字符串值的 String 。如同集合类型中描述的那样, Swift 同样也为三个主要的集合类型提供了更高效的版本, Array , Set 和 Dictionary 。

除了我们熟悉的类型之外,Swift还增加了Objective-C 中没有的类型,元组。元组允许你创建和传递一组的数据,你可以用元组当做函数的返回值来返回多个的值

Swift还增加了可选项,用来处理没有值的情况,它使得Swift更安全,这也充分说明swift是一门类型安全的编程语言,那么现在让我们开始swift的编程之旅吧

常量和变量

顾名思义,常量的值一旦设置好便不能再被更改,然而变量的值可以在将来被设置成不同的值

声明常量和变量

常量和变量必须在使用前被申明,使用关键字 let 来声明常量,使用关键字 var 来声明变量。下面是声明的一个例子

代码语言:javascript复制
let heigh = 10      //声明一个常量 不能被修改,否则会编译错误
var weight = 10     //声明一个变量 后期可以修改

类型标注

你可以在声明一个常量或者变量的时候提供类型标注,用来确认常量或者变量能够存储值的类型。添加类型标注的方式是在常量或者变量的后面加一个冒号,然后加上一个空格,最后加上要使用的类型的名称。下面举个例子:

代码语言:javascript复制
var name: String = "dapeng" //声明一个String类型的变量name

输出常量和变量

你可以使用 print(_:separator:terminator:) 函数来打印当前常量和变量中的值。

代码语言:javascript复制
var name: String = "dapeng"
print(name)
//输出 dapeng

Swift 使用字符串插值 的方式来把常量名或者变量名当做占位符加入到更长的字符串中,然后让 Swift 用常量或变量的当前值替换这些占位符。将常量或变量名放入圆括号中并在括号前使用反斜杠将其转义:

代码语言:javascript复制
var name: String = "dapeng"
print("(name) is very good")
//输出 dapeng is very good

注释

使用注释来将不需要执行的文本放入的代码当中,作为标记或者你自己的提醒。当 Swift 编译器在编译代码的时候会忽略掉你的注释。swift的注释和c的注释基本相同,下面是例子

1.单行注释

代码语言:javascript复制
// 这是一个注释

2.多行注释

代码语言:javascript复制
/* this is also a comment,
but written over multiple lines */

分号

和许多其他的语言不同,Swift 并不要求你在每一句代码结尾写分号( ; ),当然如果你想写的话也没问题。总之,如果你想在一行里写多句代码,分号还是需要的

代码语言:javascript复制
let cat = "mao"
var dog = "dog"
var people = "people";var student = "student"

类型安全和类型推断

Swift 是一门类型安全的语言。类型安全的语言可以让你清楚地知道代码可以处理的值的类型。如果你的一部分代码期望获得 String ,你就不能错误的传给它一个 Int 。

举个例子,如果你给一个新的常量设定一个 42 的字面量,而且没有说它的类型是什么,Swift 会推断这个常量的类型是 Int ,因为你给这个常量初始化为一个看起来像是一个整数的数字

代码语言:javascript复制
let meaningOfLife = 42
// meaningOfLife is inferred to be of type Int

因为 Swift 是类型安全的,他在编译代码的时候会进行类型检查,任何不匹配的类型都会被标记为错误。这会帮助你在开发阶段更早的发现并修复错误。

数值型字面量

整数型字面量可以写作:

1.一个十进制数,没有前缀 2.一个二进制数,前缀是 0b 3.一个八进制数,前缀是 0o 4.一个十六进制数,前缀是 0x

类型别名

类型别名可以为已经存在的类型定义了一个新的可选名字。用 typealias 关键字定义类型别名。

代码语言:javascript复制
typealias mInt = Int
var age:mInt = 10
var age:Int = 10
//以上两种age的声明是等同的

元组

元组把多个值合并成单一的复合型的值。元组内的值可以是任何类型,而且可以不必是同一类型。

在下面的示例中, (404, “Not Found”) 是一个描述了 HTTP 状态代码 的元组。HTTP 状态代码是当你请求网页的时候 web 服务器返回的一个特殊值。当你请求不存在的网页时,就会返回 404 Not Found

代码语言:javascript复制
let http404Error = (404, "Not Found")
// http404Error is of type (Int, String), and equals (404, "Not Found")

(404, “Not Found”) 元组把一个 Int 和一个 String 组合起来表示 HTTP 状态代码的两种不同的值:数字和人类可读的描述。他可以被描述为“一个类型为 (Int, String) 的元组”

任何类型的排列都可以被用来创建一个元组,他可以包含任意多的类型。例如 (Int, Int, Int) 或者 (String, Bool) ,实际上,任何类型的组合都是可以的。

你也可以将一个元组的内容分解成单独的常量或变量,这样你就可以正常的使用它们了:

代码语言:javascript复制
let (statusCode, statusMessage) = http404Error
print("The status code is (statusCode)")
// prints "The status code is 404"
print("The status message is (statusMessage)")
// prints "The status message is Not Found"

当你分解元组的时候,如果只需要使用其中的一部分数据,不需要的数据可以用下滑线( _ )代替:

代码语言:javascript复制
let (justTheStatusCode, _) = http404Error
print("The status code is (justTheStatusCode)")
// prints "The status code is 404"

另外一种方法就是利用从零开始的索引数字访问元组中的单独元素:

代码语言:javascript复制
print("The status code is (http404Error.0)")
// prints "The status code is 404"
print("The status message is (http404Error.1)")
// prints "The status message is Not Found"

你可以在定义元组的时候给其中的单个元素命名:

代码语言:javascript复制
let http200Status = (statusCode: 200, description: "OK")

在命名之后,你就可以通过访问名字来获取元素的值了:

代码语言:javascript复制
print("The status code is (http200Status.statusCode)")
// prints "The status code is 200"
print("The status message is (http200Status.description)")
// prints "The status message is OK"

作为函数返回值时,元组非常有用。一个用来获取网页的函数可能会返回一个 (Int, String) 元组来描述是否获取成功。相比只能返回一个类型的值,元组能包含两个不同类型值,他可以让函数的返回信息更有用。

可选项

可以利用可选项来处理值可能缺失的情况。可选项意味着:这里有一个值,它等于X或者这里根本没有值

首先明确的一个概念

1.Objective-C中的nil:表示缺少一个合法的对象,是指向不存在对象的指针,对结构体、枚举等类型不起作用(会返回NSNotFound) 2.Swift中的nil:表示任意类型的值缺失,是一个确定的值,要么是该类型的一个值要么什么都没有(即为nil)

在Swift中Optional(可选类型)是一个含有两种情况的枚举,None 和 Some(T),用来表示可能有或可能没有值。任何类型都可以明确声明为(或者隐式转换)可选类型。当声明一个可选类型的时候,要确保用括号给 ? 操作符一个合适的范围。

  • 可选类型的声明 var optionalStr: String? = "swift语言可选类型"//声明可选类型字符串,并赋初值 var opStu:Student? //声明可选opStu对象,赋初值nil 注意:在类型和 ?之间没有空格
  • 强制解析

当你确定自定义的可选类型一定有值时,可以使用操作符(!)进行强制解析,拿到数据,叹号表示”我知道一定有值,请使用它”,但是当你判断错误,可选值为nil时使用(!)进行强制解析,会有运行错误。

代码语言:javascript复制
var myValue:String? = nil
myValue="强制解析,一定有值"
if myValue != nil {
print(myValue!)//使用!进行强制解析
}else{
print("字符串为nil")
}
  • 可选项绑定

使用可选绑定,摆脱了频繁的判断是否为nil在赋值,但是使用可选绑定(optional binding)来判断可选类型是否包含值,如果包含就把值赋给一个临时常量或者变量。可选绑定可以用在if和while语句中来对可选类型的值进行判断并把值赋给一个常量或者变量。

格式

代码语言:javascript复制
if let tempStr = someOptional{
tempStr//如果someOptiona有值的话,就会赋值给tempStr,然后使用
}
代码语言:javascript复制
var myStr:String?
myStr="可选绑定的值"
if  let tempStr = myStr { //如果希望修改tempStr的值,可以定义成var
print(tempStr)
}else{
print("字符串为nil")
}
  • 隐式展开可选项

在最初的声明时使用?修饰,当你希望它自动解析是可以用!代替?来修饰,这样在变量使用时就不需要加!来强制拆包,它会自动解析

代码语言:javascript复制
let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // requires an exclamation mark

let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString // no need for an exclamation mark

print(implicitString)

0 人点赞