目录

  • 基础介绍
    • 常量let & 变量var
    • 注释
    • 分号
    • 整数
    • 浮点值
    • 类型推断 & Type Safety
    • 数字
    • 数值类型转换
    • 类型别名typealias
    • 布尔值 Bool
    • 元组 Tuples
    • Optionals
    • 错误处理
    • Assertions & Preconditions(待研究)
      • Assertions
      • Enforcing Preconditions

基础介绍

常量let & 变量var

let maximumNumberOfLoginAttempts = 10  // 常量的值设定后不能更改
var currentLoginAttempt = 0
var x = 0.0, y = 0.0, z = 0.0
var red, green, blue: Double // 理论上可以但是实际很少这么写

常量和变量名称几乎可以包含任何字符,包括一些Unicode字符。常量和变量名称不能包含空格,数学符号,箭头,专用的Unicode标量值或线条和框形图字符,不能以数字开头。不能将常量更改为变量或将变量更改为常量。如果需要命名为保留的Swift关键字名称,在关键字两端加上反引号`,不建议使用保留的keyword。

string interpolation打印法,使用 \() 打印

print("The current value of friendlyWelcome is \(friendlyWelcome)")

注释

// 单行注释
/* 多行注释
可以嵌套 */

分号

可以写也可以不写,一般不写分号。如果要在一行上编写多个单独的语句,则需要分号。

整数

Swift提供8位,16位,32位和64位形式的有符号和无符号整数。其中8位无符号整数的类型为UInt8,而32位有符号整数的类型为Int32。一般使用Int就可以了。

let minValue = UInt8.min  // minValue is equal to 0, and is of type UInt8
let maxValue = UInt8.max  // maxValue is equal to 255, and is of type UInt8

在大多数情况下,无需选择特定大小的整数即可在代码中使用。Swift提供了额外的整数类型,Int其大小与当前平台的本机字大小相同:在32位平台上,Int与大小相同Int32;在64位平台上,Int与大小相同Int64。Swift还提供了一个无符号整数类型,UInt其大小与当前平台的本机字大小相同。

浮点值

  • Double 表示一个64位浮点数,精度至少为15个十进制数字
  • Float 表示一个32位浮点数,精度可以低至6个十进制数字

类型推断 & Type Safety

当声明具有初始值的常量或变量时,swift根据类型推断来确定常量或者变量的类型,但如果没有初始值就需要明确给定改常量或变量的类型:var welcomeMessage: String
在浮点值里面默认都是Double

数字

let decimalInteger = 17           // 十进制数,无前缀
let binaryInteger = 0b10001       // 二进制数,前缀0b
let octalInteger = 0o21           // 八进制数,前缀0o
let hexadecimalInteger = 0x11     // 十六进制数,前缀0x

浮点文字可以是十进制(不带前缀)或十六进制(带0x前缀)。它们的小数点两侧必须始终有一个数字(或十六进制数字)。小数浮点数也可以有一个可选的指数,用大写或小写表示e; 十六进制浮点数必须具有指数,以大写或小写表示p。
对于指数为的十进制数字exp,基数乘以10^exp:

  • 1.25e2表示1.25 x 10^2,或125.0。
  • 1.25e-2表示1.25 x 10^-2,或0.0125。

对于指数为的十六进制数exp,将基数乘以2^exp:

  • 0xFp2表示15 x 2^2,或60.0。
  • 0xFp-2表示15 x 2^-2,或3.75。
let decimalDouble = 12.1875         // 十进制
let exponentDouble = 1.21875e1     // 指数形式
let hexadecimalDouble = 0xC.3p0        // 十六进制

数值类型转换

let twoThousand: UInt16 = 2_000
let one: UInt8 = 1
let twoThousandAndOne = twoThousand + UInt16(one)

类型别名typealias

类型别名为现有类型定义备用名称,可以使用typealias关键字定义类型别名。
想通过上下文更合适的名称来引用现有类型时,例如使用外部源中特定大小的数据时,类型别名非常有用:

typealias AudioSample = UInt16

定义类型别名后,可以在任何可能使用原始名称的地方使用别名:

var maxAmplitudeFound = AudioSample.min
// maxAmplitudeFound is now 0

在这里,AudioSample被定义为的别名UInt16。因为它是一个别名,调用AudioSample.min实际调用UInt16.min,它提供的初始值0的maxAmplitudeFound变量。

布尔值 Bool

有两个布尔常量值,true以及false

元组 Tuples

元组将多个值分组为一个复合值。元组中的值可以是任何类型,而不必彼此相同。下例描述HTTP状态代码的元组。如果请求的网页不存在,则返回状态404 Not Found

let http404Error = (404, "Not Found")
// http404Error is of type (Int, String), and equals (404, "Not Found")

可以将元组的内容分解为单独的常量或变量,然后像往常一样访问它们:

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"

如果只需要一些元组的值,则在分解元组时,请用下划线_忽略该元组的某些部分:

let (justTheStatusCode, _) = http404Error
print("The status code is \(justTheStatusCode)")
// Prints "The status code is 404"

或者,使用从零开始的索引号访问元组中的各个元素值:

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"

定义元组时,可以命名元组中的各个元素:

let http200Status = (statusCode: 200, description: "OK")

如果在元组中命名元素,则可以使用元素名称来访问这些元素的值:

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"

具有多个返回值的函数使用元组特别合适。
元组对于简单的一组相关值很有用。它们不适合创建复杂的数据结构。如果您的数据结构可能更复杂,则将其建模为类或结构,而不是元组。

Optionals

Optionls表示要么有一个值并且可访问该值,或者为nil。
以下示例使用初始化程序尝试将 String转换为Int,由于初始化程序可能失败,因此它返回一个optional Int而不是一个Int。

let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
// convertedNumber is inferred to be of type "Int?", or "optional Int"

如果定义一个可选变量而不提供默认值,则该变量将自动nil为您设置为:

var surveyAnswer: String?
// surveyAnswer is automatically set to nil
surveyAnswer = nil     // 也可以给optional赋值为nil

1. 可选值的强制展开
一旦确定可选选项确实包含一个值,就可以在可选名称的末尾添加一个感叹号!来访问其基础值

if convertedNumber != nil {print("convertedNumber has an integer value of \(convertedNumber!).")
}
// Prints "convertedNumber has an integer value of 123."

2. Optional Binding
Optional Binding一般与if 和 while语句一起使用,以检查可选内部的值,并将该值提取到常量或变量中,作为单个操作的一部分。

if let constantName = someOptional {statements
}if let actualNumber = Int(possibleNumber) {print("The string \"\(possibleNumber)\" has an integer value of \(actualNumber)")
} else {print("The string \"\(possibleNumber)\" could not be converted to an integer")
}
// Prints "The string "123" has an integer value of 123"

如果Int返回的可选Int(possibleNumber)内容包含一个值,请为该可选内容中包含的值设置一个新的常量actualNumber。如果转换成功,则该actualNumber常量可在if语句的第一分支中使用。它已经被初始化与包含在值内可选的,因此没有必要使用!后缀来访问它的价值。

您可以根据需要在单个if语句中包含尽可能多的可选绑定和布尔条件,以逗号分隔。如果可选绑定中的nil任何值是或任何布尔条件求和false,则整个if语句的条件视为false。

if let firstNumber = Int("4"), let secondNumber = Int("42"), firstNumber < secondNumber && secondNumber < 100 {print("\(firstNumber) < \(secondNumber) < 100")
}
// Prints "4 < 42 < 100"if let firstNumber = Int("4") {if let secondNumber = Int("42") {if firstNumber < secondNumber && secondNumber < 100 {print("\(firstNumber) < \(secondNumber) < 100")}}
}
// Prints "4 < 42 < 100"

3. 隐式展开的Optionals
隐式解包的可选对象视为允许在需要时强制打开可选对象的权限

let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // requires an exclamation pointlet assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString // no need for an exclamation pointlet optionalString = assumedString
// The type of optionalString is "String?" and assumedString isn't force-unwrapped.

当变量可能nil在以后出现时,请不要使用隐式展开的可选。

错误处理

当函数遇到错误条件时,它将引发错误。该函数的调用方可以捕获错误并做出适当响应。

func canThrowAnError() throws {// this function may or may not throw an error
}

函数通过throws在其声明中包含关键字来表明它可以引发错误。当调用可能引发错误的函数时,会将try关键字放在表达式的前面。
Swift会自动将错误传播到当前范围之外,直到由catch子句处理为止。

do {try canThrowAnError()// no error was thrown
} catch {// an error was thrown
}

一条do语句创建一个新的包含范围,该范围允许将错误传播到一个或多个catch子句。
这是一个示例,说明如何使用错误处理来响应不同的错误情况:

func makeASandwich() throws {// ...
}do {try makeASandwich()eatASandwich()
} catch SandwichError.outOfCleanDishes {washDishes()
} catch SandwichError.missingIngredients(let ingredients) {buyGroceries(ingredients)
}

在此示例中,makeASandwich()如果没有干净的盘子或缺少任何配料,该函数将引发错误。因为makeASandwich()会抛出错误,所以函数调用被包装在一个try表达式中。通过将函数调用包装在一条do语句中,抛出的任何错误都将传播到提供的catch子句中。

如果未引发任何错误,eatASandwich()则调用该函数。如果抛出错误并且匹配SandwichError.outOfCleanDishes大小写,则将washDishes()调用该函数。如果引发了一个错误并且与SandwichError.missingIngredients大小写匹配,则buyGroceries(_:)使用模式[String]捕获的关联值调用该函数catch。

Assertions & Preconditions(待研究)

断言和前提条件是在运行时进行的检查。可以使用它们来确保在执行任何其他代码之前满足基本条件。如果断言或前提条件中的布尔条件求值为true,则代码将照常继续执行。如果条件的计算结果为false,则程序的当前状态无效;否则,结果为0。代码执行结束,您的应用程序终止。
可以使用断言和前提条件来表达您在进行编码时所做的假设和期望,因此可以将其包含在代码中。断言可帮助在开发过程中发现错误和不正确的假设,前提条件可帮助检测生产中的问题。

Assertions

通过调用Swift标准库中的函数assert(_:_:file:line:)来编写断言

let age = -3
assert(age >= 0, "A person's age can't be less than zero.")
// This assertion fails because -3 is not >= 0.

在此示例中,如果值为负,则age >= 0就是false,断言失败,从而终止应用程序。

您可以省略断言消息assert(age >= 0)
如果代码已经检查了条件,则可以使用该assertionFailure(_:file:line:)函数指示断言失败。例如:

if age > 10 {print("You can ride the roller-coaster or the ferris wheel.")
} else if age >= 0 {print("You can ride the ferris wheel.")
} else {assertionFailure("A person's age can't be less than zero.")
}

Enforcing Preconditions

当可能的情况为false时使用Preconditions,但必须肯定是真的对你的代码继续执行。例如,使用Preconditions检查下标是否未超出范围,或检查是否已向函数传递了有效值。

可以通过调用precondition(::file:line:)函数来编写Preconditions。

// In the implementation of a subscript...
precondition(index > 0, "Index must be greater than zero.")

也可以调用该preconditionFailure(_:file:line:)函数以指示发生了故障。

Swift5 1.基础介绍相关推荐

  1. swift5.x基础知识入门

    swift5.x基础知识入门 源码在我的主页下,欢迎下载,我非常喜欢swift和oc的语法,两者相似,我坚信天下没有学不会的技术. 基本介绍 ///这里只介绍一些初学swift的基本概念,需要提前了解 ...

  2. day23:shell基础介绍 alias及重定向

    2019独角兽企业重金招聘Python工程师标准>>> 1.shell基础介绍: shell是一个命令解释器,用于用户与机器的交互: 也支持特定的语法(逻辑判断,循环): 每个用户都 ...

  3. Android NDK开发之 NEON基础介绍

    原文:http://blog.csdn.net/app_12062011/article/details/50434259 Android NDK开发之 NEON基础介绍 这是官方介绍: http:/ ...

  4. python介绍和用途-Python基础介绍(一)

    Python基础介绍(一) 1. python是什么编程语言 编译型与解释型 ​编译器吧源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以极其语言来运行此程序,速度很快 ...

  5. STL体系结构与内核分析-2-STL体系结构基础介绍(侯捷)--笔记

    STL体系结构与内核分析(侯捷) 2.STL体系结构基础介绍 STL设计方式与OO(面向对象)不同的地方,OO鼓励数据和处理数据的方法都放在类里,而STL的数据在容器里,操作数据的方法在其他部件里(模 ...

  6. ai一个线段多个箭头_初学设计却分不清PS和AI?超详细的AI基础介绍包你一看即会!...

    以前提到AI,第一个想到的就是人工智能.自从扎进设计的神坑,再提到AI,我可只认软件了~ 包括小ke在内的很多设计小伙伴在最开始入行的时候都认为,只要学好PS就可以稳打设计圈了~毕竟那么多公号一提到设 ...

  7. 深度学习与计算机视觉系列(1)_基础介绍

    转载自: 深度学习与计算机视觉系列(1)_基础介绍 - 龙心尘 - 博客频道 - CSDN.NET http://blog.csdn.net/longxinchen_ml/article/detail ...

  8. 【学习笔记】Tableau基础介绍

    Tableau基础介绍 [简介] Tableau是一家提供商业智能的软件公司,正式成立于2004年,总部位于美国华盛顿西雅图. 源自美国国防部的一个项目需求,在斯坦福博士克里斯·斯图尔特和Pixar创 ...

  9. python最基本的规则是什么_Python基础介绍(一)

    Python基础介绍(一) 1. python是什么编程语言 编译型与解释型 ​编译器吧源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以极其语言来运行此程序,速度很快 ...

最新文章

  1. Cesium调用 WMS 、WMTS 服务
  2. 第五周项目一-三角形类雏形(5)
  3. 看固态存储厂商在硝烟四起的市场中如何发展?
  4. 手忙脚乱的快乐 谈谈Overcooked让人爱恨交织的多人合作机制
  5. svg 动画_根据AI导出的SVG path制作SVG线条动画
  6. wait() 和 waitpid()
  7. iText in Action 2nd5.2节(Events for basic building blocks)读书笔记
  8. Iptables Nat转发
  9. netty冲突 play sbt_播放Cassandra Netty Server空指针异常-问答-阿里云开发者社区-阿里云...
  10. c#实现程序的互斥运行
  11. php如何解决高并发问题
  12. 基于stm32智能门锁系统
  13. 网络技术学习:虚拟专用网络
  14. 为什么公务员需要考MPA?
  15. 北大学霸隐居20年,王青松花光350万后,如今怎么样了?
  16. 第二十五届全国青少年信息学奥林匹克联赛初赛
  17. 使用<style>标签为元素定义CSS样式
  18. SICP读书笔记2---if和cond的区别
  19. 标准配置输入设备微型计算机,2012年计算机一级MsOffice第五十三套练习题及答案解析...
  20. 大数据开发岗位面经收集

热门文章

  1. 2019年高考志愿指导书
  2. 各大公司在GitHub上开源投入排名分析
  3. 设计模式--生成器模式
  4. JS获取input框用户输入信息作为数组存储传输给后台数据库操作存储方法
  5. Web二维矩阵matrix详解
  6. 云盘下载利器proxyee-down
  7. 【读书笔记】高效学习的秘密
  8. app图标圆角角度_[转载]iOS app 图标的圆角半径是多少?
  9. 基于RSocket的Java与浏览器JS通信
  10. Flutter入门实战教程:从0到1仿写web版掘金App (完结)