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只能是奇数,偶数无法创建九宫格,这里可以使用断言的方式进行判断,代码如下所示:
- //n行n列的九宫格
- let n = 3
- assert(n % 2 != 0, "n必须是奇数")
其次定义一个整型的二维数组,并且将所有的元素初始为0,代码如下所示:
- //定义一个二维数组用于存放1~n*n个数字
- var array = [[Int]](count: n , repeatedValue: [Int](count:n , repeatedValue: 0))
步骤二:将1~n*n个数字放入九宫格
首先定义两个整型变量row和col分别记录行号和列号也就是二维数组的下标,从第零行的中间一个空格开始放入数字,因此row和col分别初始化为0和n/2,代码如下所示:
- //从0行n/2列开始放第一个数字
- var row = 0
- var col = n/2
然后使用for循环依次将1~n*n个数字放入二维数组array,注意区分行越界、列越界、行列同时越界以及冲突这四种情况的处理,代码如下所示:
- //依次将1~n*n个数字放入二维数组array
- forvari = 1;i <= n*n;i++ {
- array[row][col] = i
- row--
- col++
- if row < 0 && col >= n {//行列都越界
- row += 2
- col--
- }else if col >= n {//列越界
- col = 0
- }else if row < 0 {//列越界
- row = n-1
- }else if array[row][col] != 0 {//冲突
- row += 2
- col--
- }
- }
这样就完成了九宫格的程序,运行结果如图-11所示:
图-11
1.4 完整代码
本案例中,完整代码如下所示:
- importUIKit
- //n行n列的九宫格
- let n = 3
- assert(n%2 != 0, "n必须是奇数")
- //定义一个二维数组用于存放1~n*n个数字
- var array = [[Int]](count: n , repeatedValue: [Int](count:n , repeatedValue: 0))
- //从0行n/2列开始放第一个数字
- var row = 0
- var col = n/2
- forvari = 1;i <= n*n;i++ {
- array[row][col] = i
- row--
- col++
- if row < 0 && col >= n {//行列都越界
- row += 2
- col--
- }else if col >= n {//列越界
- col = 0
- }else if row < 0 {//列越界
- row = n-1
- }else if array[row][col] != 0 {//冲突
- row += 2
- col--
- }
- }
- 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,代码如下所示:
- //统计每个人的得票数
- var vote = [String:Int]()
步骤二:遍历数组统计票数
遍历选票数组,判断每个人姓名name出现的次数,每出现一次name,vote[name]的value值则加1,如果name第一次出现vote[name]的value则设置为1,代码如下所示:
- //统计每个人的得票数
- var vote = [String:Int]()
- for name in ballot {
- //如果vote[name]有值则表示出现过
- if let cnt = vote[name] {
- vote[name] = cnt+1
- }else {
- //如果vote没值则表示第一次出现
- vote[name] = 1
- }
- }
运行结果如图-12所示:
图-12
2.4 完整代码
本案例中,完整代码如下所示:
- importUIKit
- //选票
- let ballot = ["Daniel", "Mark", "Shasha", "Shanshan", "Daniel", "Daniel", "Mark", "Shasha", "Daniel","Apple","Apple"];
- //统计每个人的得票数
- var vote = [String:Int]()
- for name in ballot {
- //如果vote[name]有值则表示出现过
- if let cnt = vote[name] {
- vote[name] = cnt+1
- }else {
- //如果vote没值则表示第一次出现
- vote[name] = 1
- }
- }
- vote
3 计算一个字符串中元音和辅音的个数
3.1 问题
本案例使用函数多个返回值的特点完成一个count函数,该函数用于计算一个字符串中元音、辅音以及其他字母的个数。
3.2 方案
而在Swift里面函数可以有多个返回值,返回值类型是元组类型,可以通过名称和下标访问元组元素,元组的成员不需要在函数中返回时命名,已经在函数返回类型中定义好了。
3.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:定义一个返回元组类型的函数
由于需要通过函数count同时得到一个字符串中元音、辅音以及其他字母的个数,所以count函数将返回一个元组类型,包含多个值,代码如下所示:
- func count(string:String)->(vowels:Int, consonants:Int, others:Int) {
- }
步骤二:实现count函数
count函数内部根据传入的字符串,依次判断字符串的每个字符是属于元音还是辅音,或是其他字符,代码如下所示:
- func count (string:String)->(vowels:Int,consonants:Int,others:Int) {
- string.lowercaseString
- var vowels = 0
- varconsonats = 0
- var others = 0
- for character in string {
- switch String(character).lowercaseString {
- case "a","e","i","o","u":
- vowels++
- case "b","c","d","f","g","h","j","k","l","m","n","p","q","r","s","t","v ","w","x","y","z":
- consonats++
- default:
- others++
- }
- }
- return (vowels,consonats,others)
- }
然后调用函数,运行结果如图-13所示:
图-13
3.4 完整代码
本案例中,完整代码如下所示:
- importUIKit
- //返回元组类型的函数
- func count (string:String)->(vowels:Int,consonants:Int,others:Int) {
- string.lowercaseString
- var vowels = 0
- varconsonats = 0
- var others = 0
- for character in string {
- switch String(character).lowercaseString {
- case "a","e","i","o","u":
- vowels++
- case "b","c","d","f","g","h","j","k","l","m","n","p","q","r","s","t","v ","w","x","y","z":
- consonats++
- default:
- others++
- }
- }
- return (vowels,consonats,others)
- }
- letstr = "tarena#"
- count(str)
Swift---- 可选值类型(Optionals) 、 断言(Assertion) 、 集合 、 函数的更多相关文章
- Swift - 37 - 值类型和引用类型的简单理解
//: Playground - noun: a place where people can play import UIKit // 值类型:指的是当一个变量赋值给另外一个变量的时候, 是copy ...
- swift的值类型和引用类型
前言 最近在学设计模式中,发现 Swift 中的 struct,class 以及 enum 在一般的使用中能够做到互相替换,因此探究其背后的逻辑就十分有必要.而这一问题又引出了 Swift 中的值类型 ...
- swift可选值总结
1.枚举结构: 2.装包.解包概念:关联值. 3.可选值声明: 4.解包: 5.可选值作为参量生成的链. 6.可选值调用链. 最后做个总结 访问可选对象的属性或方法时,可以用 ? 号 访问可选对象的属 ...
- Swift 可选值(Optional Values)介绍
Optional的定义 Optional也是Objective-C没有的数据类型,是苹果引入到Swift语言中的全新类型,它的特点就和它的名字一样:可以有值,也可以没有值,当它没有值时,就是nil.此 ...
- 窥探Swift之新添数据类型元组与可选值
今天的博客中就总结一下关于Swift中相对Objc新添加的两个数据类型:元组(Tuple)和可选值类型(Optional).上面这两个类型是Swift独有的类型,使用起来也是非常方便的,今天就通过一些 ...
- Swift语言指南(六)--可选值
原文:Swift语言指南(六)--可选值 在值可能不存在的情况下使用可选值(optional), 可选值是: · 存在一个值,这个值等于 x 或 · 不存在任何值 注: 在 C 和 Objective ...
- Swift 值类型和引用类型的内存管理
1.内存分配 1.1 值类型的内存分配 在 Swift 中定长的值类型都是保存在栈上的,操作时不会涉及堆上的内存.变长的值类型(字符串.集合类型是可变长度的值类型)会分配堆内存. 这相当于一个 &qu ...
- C#值类型和引用类型与Equals方法
1. C#的值类型和引用类型 C#的对象里面有两种类型,一个是引用类型,一个是值类型,值类型和引用类型的具体分类可以看下面的分类. 在C#中,不管是引用类型还是值类型,他们都隐式继承Object类 ...
- 【C#进阶系列】05 基元类型、引用类型和值类型
基元类型和FCL类型 FCL类型就是指Int32这种类型,这是CLR支持的类型. 而基元类型就是指int这种类型,这是C#编译器支持的,实际上在编译后,还是会被转为Int32类型. 而且学过C的朋友 ...
随机推荐
- table表格宽度固定,同时td内容过长也不会被撑开
table表格宽度固定,同时td内容过长也不会被撑开,设置如下css: table{table-layout:fixed;word-break:break-all;}
- SetProcessAffinityMask的问题
BOOL WINAPI SetProcessAffinityMask( _In_ HANDLE hProcess, _In_ DWORD_PTR dwProcessAffinityMask );//M ...
- 用markdown学习写出总结
# PS### 快捷键:CTRL+N(新建)CTRL+1. **切片**- 套索,磁性套索,椭圆,矩形选框.2. **印章** 仿制图章工具,图案图章工具3. 钢笔4. 油漆桶5. 吸管工具, *** ...
- cc1101 ASK发射模式
cc1101 配置 433.919830Mhz 1.19948kBaud 199.951172 58.035714 #ifndef _CC1100_H_#define _CC1100_H_ ...
- #define DELAY_ONE_MICROSECOND (-10) 时间是负数的原因
以下摘自DOOM的博文<内核同步对象> http://blog.csdn.net/lqk1985/article/details/2541867 “最后一个参数&timeout是一 ...
- SEO学习笔记-误区和经验总结
原文链接:http://www.cnblogs.com/monxue/p/seo_note.html 常见误区和错误: 1.忽视404错误页面的优化,没有及时处理死链导致权重降低 2.做外链优化只链到 ...
- HDU--1232--畅通工程--并查集
畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- win环境 yii2 框架 overtrue/wechat 包 由 sys_get_temp_dir 引发的 the directory "c:\Windows" is not writable
vendor\overtrue\wechat\src\Foundation\Application.php registerBase 方法 在初始化属性时 $this['cache'] = funct ...
- Android中的Context
Context用来访问全局信息的接口,比如影城程序的资源.一些常用的组件都是继承自Context,目的就是方便的访问资源,比如Activity, Service.... 从Context访问本组件的资 ...
- Python学习06——列表的操作(2)
笨办法学Python第39节 之前用的第三版的书,昨天发现内容不对,八块腹肌又给我下了第四版,这次的内容才对上.本节的代码如下: ten_things = "Apples Oranges C ...