Swift---- 可选值类型(Optionals) 、 断言(Assertion) 、 集合 、 函数

1 使用数组实现九宫格

1.1 问题

Swift提供经典的数组和字典两种集合类型来存储集合数据。本案例使用数组实现一个九宫格程序,如图-1所示:

图-1

1.2 方案

九宫格就是有一个n行n列的方格,将1至n*n个数字依次放入方格中,使得每行每列以及每个对角线上的数字相加的和相等,这里提供一种九宫格的算法,以3*3的九宫格为例,依次将1~9放入方格内,首先第一步将数字1放入第一行中间一格,如图-2所示:

图-2

然后将数字放入数字1右上角45度的空格位置,如图-3所示:

图-3

但是数字2已经放到方格外面,这种情况称为行越界,如果数字行越界就将其放入该列对应的最后一行,如图-4所示:

图-4

接下来同第二个步骤一样在数字2右上角45度的空格位置放入数字3,如图-5所示:

图-5

但是数字3已经放到方格外面,这种情况称为列越界,如果数字列越界就将其放入该行对应的最后一列,如图-6所示:

图-6

然后同上面的步骤一样在数字3右上方45度的空格位置放入数字4,但是该空格已经放入数字1,那么就将数字4放入数字3下面的空格,如图-7所示:

图-7

在接下来同上面的步骤依次在数字4的右上方45度空格放入数字5,在数字5的右上方45度空格放入数字6,如图-8所示:

图-8

当在数字6右上方45度的空格位置放入数字7的时候,发现数字7行列都越界了,如果数字行列都越界,就和数字冲突的情况采用一样的处理方式,将数字7放入数字6下方的空格,如图-9所示:

图-9

最后同上面的步骤一样放入数字8和数字9,这样就完成了3*3的九宫格,每行每列和每个对角线加起来都是15,如图-10所示:

图-10

1.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:定义一个二维数组

首先定义一个常量n,用于规定创建一个n行n列的九宫格,并且n只能是奇数,偶数无法创建九宫格,这里可以使用断言的方式进行判断,代码如下所示:

  1. //n行n列的九宫格
  2. let n = 3
  3. assert(n % 2 != 0, "n必须是奇数")

其次定义一个整型的二维数组,并且将所有的元素初始为0,代码如下所示:

  1. //定义一个二维数组用于存放1~n*n个数字
  2. var array = [[Int]](count: n , repeatedValue: [Int](count:n , repeatedValue: 0))

步骤二:将1~n*n个数字放入九宫格

首先定义两个整型变量row和col分别记录行号和列号也就是二维数组的下标,从第零行的中间一个空格开始放入数字,因此row和col分别初始化为0和n/2,代码如下所示:

  1. //从0行n/2列开始放第一个数字
  2. var row = 0
  3. var col = n/2

然后使用for循环依次将1~n*n个数字放入二维数组array,注意区分行越界、列越界、行列同时越界以及冲突这四种情况的处理,代码如下所示:

  1. //依次将1~n*n个数字放入二维数组array
  2. forvari = 1;i <= n*n;i++ {
  3. array[row][col] = i
  4. row--
  5. col++
  6. if row < 0 && col >= n {//行列都越界
  7. row += 2
  8. col--
  9. }else if col >= n {//列越界
  10. col = 0
  11. }else if row < 0 {//列越界
  12. row = n-1
  13. }else if array[row][col] != 0 {//冲突
  14. row += 2
  15. col--
  16. }
  17. }

这样就完成了九宫格的程序,运行结果如图-11所示:

图-11

1.4 完整代码

本案例中,完整代码如下所示:

  1. importUIKit
  2. //n行n列的九宫格
  3. let n = 3
  4. assert(n%2 != 0, "n必须是奇数")
  5. //定义一个二维数组用于存放1~n*n个数字
  6. var array = [[Int]](count: n , repeatedValue: [Int](count:n , repeatedValue: 0))
  7. //从0行n/2列开始放第一个数字
  8. var row = 0
  9. var col = n/2
  10. forvari = 1;i <= n*n;i++ {
  11. array[row][col] = i
  12. row--
  13. col++
  14. if row < 0 && col >= n {//行列都越界
  15. row += 2
  16. col--
  17. }else if col >= n {//列越界
  18. col = 0
  19. }else if row < 0 {//列越界
  20. row = n-1
  21. }else if array[row][col] != 0 {//冲突
  22. row += 2
  23. col--
  24. }
  25. }
  26. array

2 统计选票程序

2.1 问题

有一个常量数组ballot,里面存放的是选票信息,通过一个字典统计出每个人的票数。

2.2 方案

首先创建一个可变字典vote用于存放人员信息和票数,该字典的类型是[String:Int],选票数组中的人员姓名就是该字典的key。

然后遍历选票数组,判断每个人姓名出现的次数,每出现一次name,vote[name]的value值则加一,如果name第一次出现vote[name]的value则设置为1。

2.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:创建一个可变字典vote

首先创建一个可变字典vote用于存放人员信息和票数,该字典的类型是[String:Int],选票数组中的人员姓名就是该字典的key,代码如下所示:

  1. //统计每个人的得票数
  2. var vote = [String:Int]()

步骤二:遍历数组统计票数

遍历选票数组,判断每个人姓名name出现的次数,每出现一次name,vote[name]的value值则加1,如果name第一次出现vote[name]的value则设置为1,代码如下所示:

  1. //统计每个人的得票数
  2. var vote = [String:Int]()
  3. for name in ballot {
  4. //如果vote[name]有值则表示出现过
  5. if let cnt = vote[name] {
  6. vote[name] = cnt+1
  7. }else {
  8. //如果vote没值则表示第一次出现
  9. vote[name] = 1
  10. }
  11. }

运行结果如图-12所示:

图-12

2.4 完整代码

本案例中,完整代码如下所示:

  1. importUIKit
  2. //选票
  3. let ballot = ["Daniel", "Mark", "Shasha", "Shanshan", "Daniel", "Daniel", "Mark", "Shasha", "Daniel","Apple","Apple"];
  4. //统计每个人的得票数
  5. var vote = [String:Int]()
  6. for name in ballot {
  7. //如果vote[name]有值则表示出现过
  8. if let cnt = vote[name] {
  9. vote[name] = cnt+1
  10. }else {
  11. //如果vote没值则表示第一次出现
  12. vote[name] = 1
  13. }
  14. }
  15. vote

3 计算一个字符串中元音和辅音的个数

3.1 问题

本案例使用函数多个返回值的特点完成一个count函数,该函数用于计算一个字符串中元音、辅音以及其他字母的个数。

3.2 方案

而在Swift里面函数可以有多个返回值,返回值类型是元组类型,可以通过名称和下标访问元组元素,元组的成员不需要在函数中返回时命名,已经在函数返回类型中定义好了。

3.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:定义一个返回元组类型的函数

由于需要通过函数count同时得到一个字符串中元音、辅音以及其他字母的个数,所以count函数将返回一个元组类型,包含多个值,代码如下所示:

  1. func count(string:String)->(vowels:Int, consonants:Int, others:Int) {
  2. }

步骤二:实现count函数

count函数内部根据传入的字符串,依次判断字符串的每个字符是属于元音还是辅音,或是其他字符,代码如下所示:

  1. func count (string:String)->(vowels:Int,consonants:Int,others:Int) {
  2. string.lowercaseString
  3. var vowels = 0
  4. varconsonats = 0
  5. var others = 0
  6. for character in string {
  7. switch String(character).lowercaseString {
  8. case "a","e","i","o","u":
  9. vowels++
  10. case "b","c","d","f","g","h","j","k","l","m","n","p","q","r","s","t","v ","w","x","y","z":
  11. consonats++
  12. default:
  13. others++
  14. }
  15. }
  16. return (vowels,consonats,others)
  17. }

然后调用函数,运行结果如图-13所示:

图-13

3.4 完整代码

本案例中,完整代码如下所示:

  1. importUIKit
  2. //返回元组类型的函数
  3. func count (string:String)->(vowels:Int,consonants:Int,others:Int) {
  4. string.lowercaseString
  5. var vowels = 0
  6. varconsonats = 0
  7. var others = 0
  8. for character in string {
  9. switch String(character).lowercaseString {
  10. case "a","e","i","o","u":
  11. vowels++
  12. case "b","c","d","f","g","h","j","k","l","m","n","p","q","r","s","t","v ","w","x","y","z":
  13. consonats++
  14. default:
  15. others++
  16. }
  17. }
  18. return (vowels,consonats,others)
  19. }
  20. letstr = "tarena#"
  21. count(str)
时间: 2024-11-12 20:51:21

Swift---- 可选值类型(Optionals) 、 断言(Assertion) 、 集合 、 函数的相关文章

swift 可选值

// 可选值 let cities_ = ["Paris": 2241, "Madrid": 3165, "Amsterdam": 827, "Berlin": 3562] //  madridPopulation 的类型是可选类型 Int?,而非 Int.一个 Int? 类型的值是 Int 或者特 //殊的 "缺失" 值 nil let madridPopulation: Int? = cities_[&

【swift初见】Swift可选值Optionals

我们用oc开发的时候,经常会遇到null值的情况,如果不加任何判断的话可能会导致程序崩溃,swift语言添加了可选值这样的概念,基本语法如下: 可选类型: var optValue: Int? = 8 在类型后面加一个?表示optValue这个值可以为nil,"?"就是可选值的一个标记,?其实是一个Optionals的类型,我们可以看看swift的源码: enum Optional<T> : Reflectable, NilLiteralConvertible { case

窥探Swift之新添数据类型元组与可选值

今天的博客中就总结一下关于Swift中相对Objc新添加的两个数据类型:元组(Tuple)和可选值类型(Optional).上面这两个类型是Swift独有的类型,使用起来也是非常方便的,今天就通过一些示例来介绍一下如何初始化和使用元组和可选值类型以及使用元组和可选值类型的场景.废话少说,直奔主题,在今天的示例代码中仍然是使用Playground来测试的.左边是代码,右边是Playground中的结果. 一.Swift中的元组(Tuple) 元组类似于C语言中的结构体(Struct),用来存储一组

Swift 值类型和引用类型的内存管理

1.内存分配 1.1 值类型的内存分配 在 Swift 中定长的值类型都是保存在栈上的,操作时不会涉及堆上的内存.变长的值类型(字符串.集合类型是可变长度的值类型)会分配堆内存. 这相当于一个 "福利",意味着你可以使用值类型更快速的完成一个方法的执行. 值类型的实例只会保存其内部的存储属性,并且通过 "=" 赋值的实例彼此的存储是独立的. 值类型的赋值是拷贝的,对于定长的值类型来说,由于所需的内存空间是固定的,所以这种拷贝的开销是在常数时间内完成的. struct

Swift学习笔记(2)--元组(Tuples)、Optional(可选值)、(Assertions)断言

1.Tuples(元组) 元组是多个值组合而成的复合值.元组中的值可以是任意类型,而且每一个元素的类型可以是不同的. 1>定义:使用()包含所有元素,用逗号分开,也可以对每个元素做命名 ? 1 2 let http404Error = (404, "Not Found") let http200Status = (statusCode: 200, description: "OK")  //重命名 2>获取元素: a.部分获取:是需要部分元素,其余忽略的

[iOS] Swift 初学手册:可选类型 (Optionals)

原文地址:http://blog.callmewhy.com/2014/09/23/beginners-guide-optionals-swift/ 几周前 (译者注:原文发表于6月24日),苹果发布了一个全新的编程语言: Swift .从那时起,我一直在阅读Swift 官方手册,并且在 Xcode6 beta 上把玩学习.我开始喜欢上了 Swift 的简洁和语法.我和我的团队一起学习这门全新的语言,并且将它和 Objective-C 这个有着30年历史的老伙计进行对比.同时,我们也在努力探索如

Swift编程语言学习1.6——可选值

可选值 使用可选(optionals)来处理值可能缺失的情况.可选表示: 有值,等于 x   或者没有值 注意: C 和 Objective-C 中并没有可选这个概念.最接近的是 Objective-C 中的一个特性,一个方法要不返回一个对象要不返回nil,nil表示"缺少一个合法的对象".然而,这只对对象起作用--对于结构体,基本的 C 类型或者枚举类型不起作用.对于这些类型,Objective-C 方法一般会返回一个特殊值(比如NSNotFound)来暗示值缺失.这种方法假设方法的

关于swift的可选值(optional)

关于可选值optional 不同于OC,swift引入了一个新的概念——可选值,了解这个optional,对于swift的学习至关重要 概念定义:可以有值也可以没有值(nil)的一个类型.换句话说,它有两个状态:有值,没有值(nil) 按我的理解,可选值是带有布尔类型加持的普通类型 如何定义一个可选值呢? 上面的代码简单定义了一个叫做optionalValue的可选值. 和普通的变量定义没有太大区别,唯一不同在于,这里多了一个问号,?是对普通值的封包 要加在类型后面,也就是说,在变量或者常量的所

swift的可选值(optional)

苹果那文档写了一大堆也没有好好的写一下可选值(optional)这个东西.就是在有一个“Optional Chaining”的章节,但是也不是很充分的说明.最后找了半天在“the basics”里墨迹了几句.如果你没找到optional这个东西的话,那你可能也错过了一个很重要的东西,非optional类型的变量,这个变量的值不能是nil.这一点和ObjC以及其他的编程语言如C#.Java什么的差别很大. var example : String = "hello world" exam