首页 文章 精选 留言 我的

精选列表

搜索[三大系统],共10000篇文章
优秀的个人博客,低调大师

swift4.1 系统学习七

import Foundation //swift学习笔记07 /* 控制流语句 学过任何一种语言的小伙伴们都对控制流语句不陌生,几乎每一天都在用。 控制流分类: 1.分支 2.循环 */ /* do语句块 这个语句块在我之前的学习中一直在使用,是一种在学习中很方便的写代码的方式。 作用: 1》作为一个单独的作用域,声明的局部对象外部是无法访问的。 允许嵌套,如果内部的变量名字与外部相同,则会访问内部变量。 */ do { let a = 1, b = 2 do { let a = 10 let b = 20 let c = 5 do { let a = 30 let b = 40 + c print("最里层: a = \(a), b = \(b), c = \(c)") //a = 30, b = 45, c = 5 } print("第二层: a = \(a), b = \(b), c = \(c)") } print("最外层: a = \(a), b = \(b)") } swift中如果不用do引出,而是单单用花括号{ },那么它默认表达的是一个闭包表达式,而不是一个语句块。 /* 2.if语句 注意: 1》swift中if语句中的条件表达式的圆括号可以省略 2》swift中if语句中的花括号不能省略,即使只有一条语句 */ do { let a = 0, b = 10 if a == 0 { print("a = 0") } else { print("a != 0") } if a + b > 10 { print("大于10") } else if a + b == 10 { print("等于10") } else { print("小于10") } /* 初学者要注意 if 表达式 { } else if 表达式 { } 与 if 表达式 { } if 表达式 { } 这两者之间的不同 */ } /* 三目条件操作符 表达式 ? 语句1 :语句2 意思是: 如果表达式==true,执行语句1,否则执行语句2 是对if...else 语句的一种更加简单的表达 */ do { var a = 1, b = 2 a = a > 0 ? a + b : a - b print("a = \(a)") b = a > b ? a : b print("b = \(b)") } 注意: 三目运算符中的 ?一定要与表达式之间有空格,不然会被当做可选类型的?。最好三目运算符表达式之间都要加空格。 /* switch语句 条件选择多于等于三条的时候,就要考虑使用switch语句,使得逻辑更加的清晰。 switch 表达式 { case 条件1: case 条件2: ... 注意: 1》swift中,switch后面的表达式可以是void类型。 2》一般情况下switch语句块中,最后会跟一个default标签,以处理异常情况。但是, 当switch的case语句已经列举了所有类型之后,default就不需要了,如果加了不必要的default, 编辑器会报出警告。 3》swift语言中,switch后面的表达式可以是任何遵循了Equatable协议的类型的表达式, 甚至还可以是一个元类型。 但是case后面的表达式必须是表示值类型的表达式。 4》所有的case语句包括default语句都必须至少包含一条语句。 5》默认情况下,执行完一个case语句块之后直接跳出switch,而不需要显式添加break语句。 当我们在某些情况下想跳出当前的case语句的时候,可以使用break语句,跳出整个switch语句块。 switch 常常与 enum 一起使用 } */ do { enum Type: String { case iphone5 = "iphone5" case iphone6 = "iphone6" case iphone7 = "iphone7" case iphone8 = "iphone8" case iphoneX = "iphoneX" } var type: Type = .iphoneX type = .iphone6 switch type { case .iphone5: print(type) case .iphone6: print(type) case .iphone7: print(type) case .iphone8: print(type) case .iphoneX: print(type) } } do { class Test: CustomStringConvertible { var a = 0, b = 100 init(a: Int, b: Int) { self.a = a self.b = b } var description: String { return "a = \(a), b = \(b)" } } let t = Test.init(a: 5, b: 10) let q = Test.init(a: 6, b: 88) switch t { case let obj: print("obj = \(obj)") print("value = \(obj.a + t.b)") } switch type(of: t) { case let type: print("type is :\(type)") } switch type(of: q) { case let type: print("type is :\(type)") } } do { struct MyObject: Equatable { var a = 0 var b = 1 public static func == (lhs: MyObject, rhs: MyObject) -> Bool { return (lhs.a == rhs.a && lhs.b == rhs.b) } } let obj = MyObject(a: 3, b: 4) let obj2 = MyObject(a: 3, b: 3) switch obj { case MyObject(): print("dummy object") case obj2: print("obj2") case MyObject(a:3, b:4): print("correct object") default: print("no match") } //打印出:correct object } /* case匹配模式 swift编程语言中的case匹配非常的丰富,除了上面已经介绍过的匹配方式,还有 1》复合case匹配, 2》区间匹配, 3》值绑定匹配形式 4》以及where从句引出的谓词逻辑匹配。 */ //1>复合case匹配 /* 概念:一条case语句可以包含多个表达式,各个表达式之间用逗号分隔,这些表达式之间只要有一个能与 switch表达式匹配上,那就执行该case下的语句。 */ do { var a: Int8 = 10 switch a { //复合case case 0, 1, 2: print("zero") //case后面的表达式亦需要一定是常量和字面量,也可以是变量 case a + 1, a: print("加1") a = a + 1 print("a = \(a)") default: break } } // case后面还可以跟一个范围表达式 do{ let score = 88 switch score { case 0..<60: print("不及格") case 60..<80: print("良好") case 80..<99: print("优") case 100: print("完美") default: break } } // swift语言中case匹配还有一个强大的功能——值绑定 /* 一般情况下,我们可以直接在case后面直接跟let或者var声明一个局部对象,以捕获switch后面表达式的值。 该对象只能在当前的case中可见。不需要default标签。 */ do { let a = 8 switch a { case 0, 1, 2..<5: print("正产值") case let v: print("v = \(v)") } switch a { case var v: v += 1 print("v = \(v)") case 100: print("永远不会执行") } print("a = \(a)") } //基于值绑定基础上使用where从句 /* where后面直接跟一个bool表达式,表示当该表达式为真的时候则匹配当前的case, 这么一来,只绑定也无法覆盖所有的case情况了,所以需要default处理。 */ do { let a = 8 switch a { case let v where v > 0 && v < 3: print("正常值") case let v where v >= 3 && v <= 10: print("\(v)在[3,10]之间") default: print("别的值") } } // 6. case 匹配模式用于元组对象 do{ let tuple = (8, 9) switch tuple { case (0, 0): print("0") case (1, 2), (3, 4): print("one") case (5, 6), (7, 8): print("two") case (_, 8): print("哈哈哈哈") case (1...3, 5..<10), (_, 4...9): print("区间") default: print("其他值") } }

优秀的个人博客,低调大师

swift4.1 系统学习八

// // main.swift // swift08 // // Created by iOS on 2018/9/28. // Copyright © 2018年 weiman. All rights reserved. // import Foundation //swift学习笔记8 /* 1. for-in 循环 swift中使用for-in循环还是很频繁的。在swift中,没有OC中的for(,,){}循环了,遍历数组、字典、 区间、字符串等都是使用for-in循环。 */ do { // 1.遍历数组 let names = ["小明", "Ann", "小蓝", "张三"] for name in names { print("Hello, \(name)") } //2.遍历字典 let numbersOfLegs = ["蜘蛛": 8, "螃蟹": 8, "猫咪": 4, "蚂蚁": 6] for (name, legs) in numbersOfLegs { print("\(name) have \(legs) legs") } //3.遍历范围 for index in 1...5 { print("\(index) * 5 = \(index * 5)") } /* 注意: 上面例子中的循环变量是不需要显式声明的,它是一个每次循环开始时被自动赋值的常量。 如果不需要它,可以使用 _ 代替。 */ } // 2. while循环 /* swift中的while循环与C语言类似,语法为: while 表达式 { ... } 注意: 1.这里的表达式可以省略小括号 2.花括号不能省略,哪怕只有一条语句 */ do { // 计算1到10000的求和 var sum = 0 var num = 1 while num <= 10000 { sum += num num += 1 } print("sum = \(sum), num = \(num)") //计算10的阶乘 num = 10 var f = 1 while num > 1 { f = f * num num -= 1 } print("f = \(f)") } /* break语句:跳出当前循环体; continue语句: 跳过当前这一次的循环,继续下一次循环。 */ do { var i = 3 while i > 0 { var j = 4 while j > 0 { print("i = \(i), j = \(j)") j -= 1 if i + j < 3 { break } } i -= 1 if i == 2 { continue } print("外层 i = \(i)") } /* i = 3, j = 4 i = 3, j = 3 i = 3, j = 2 i = 3, j = 1 i = 2, j = 4 i = 2, j = 3 i = 2, j = 2 i = 2, j = 1 外层 i = 1 i = 1, j = 4 i = 1, j = 3 i = 1, j = 2 外层 i = 0 */ } //3. repeat-while循环 /* 语法: repeat { ... } while 表达式 执行逻辑: 先执行repeat语句块中的语句,然后判断表达式是否为真,如果为真就继续执行repeat语句块 的语句,如果为假,就停止循环,继续执行while下面的语句。 */ do { // 计算1到10的和 var sum = 0 var num = 10 repeat { sum += num num -= 1 } while num > 0 print("sum = \(sum), num = \(num)") // 10的阶乘 var jc = 1 var n = 10 repeat { jc *= n n -= 1 print("n = \(n), jc = \(jc)") } while n > 0 print("10! = \(jc)") } // 4. 标签语句 /* 标签语句是做什么的? 可以方便地跳出指定的do语句块、if语句块、switch语句块、for-in语句块、 while语句块或者repeat语句块。 如何跳出? 当我们需要跳出指定的语句块的时候,我们可以在语句块之前加上标签,然后通过 break label 语句跳出。 在循环体中,标签也可以与continue一起使用跳过某个指定循环的当前迭代,直接执行下一次迭代。 */ do { var a = 100 label: do { label2: if a > 50 { break label } else { label3:if a < 50 { break label3 } else { break label2 } } break label } } /* 个人建议: 标签语句会破坏代码的可读性,建议尽量少的使用,不然时间一长,自己都不知道这块为什么要这样跳来跳去的 */

优秀的个人博客,低调大师

swift4.1 系统学习六

swift学习笔记6 字符和字符串 在swift中,String类型也是结构体,属于值类型,而不是引用类型。这一点,与OC是不一样的。 // // main.swift // swift06 // // Created by iOS on 2018/9/25. // Copyright © 2018年 weiman. All rights reserved. // import Foundation // 概述 do { let a = "a" print(a) let b = "hello" print(b) let c = "你好呀" print(c) let d = """ 今天天气很好,我出去逛逛。 it is a good day today, I'm going to have a walk. 今日は天気がよいので,私は出かけて出かけます. """ print(d) } //注意,swift中引入了多行字符串字面量的表达形式,通过 """三个双引号包围起来,可以输入换行符。 // 输出不想有换行符,但是文字较长,在书写的时候有换行符,这个时候我们可以在换行符前面加上 \,例如: do { let a = """ 白日依山尽,\ 黄河入海流。\ 欲穷千里目,\ 更上一层楼 """ print(a) /* 输出: 白日依山尽, 黄河入海流。 欲穷千里目, 更上一层楼 */ } // 字符 /* 在swift编程语言中,对字符的表示是独立于某一种特定的Unicode编码的。 整个Unicode标准编码由三个平面构成: 1.基本多语言平面:大部分拉丁字母、希腊字母、标点符号、亚洲的部分字母; 2.补充平面:包含了某些不在基本多语言平面的非拉丁字符、亚洲文字等,所有Emoji表情; 3.保留平面:永久保留的码点部分。 */ do { // 创建一个字符对象 ‘0’ // 注意,使用UnicodeScalar构造出来的对象是可选的。 let zero = UnicodeScalar("0") if let z = zero { print("z = \(z)") print("scalar value = \(z.value)") } // 使用类型标注的方式声明并初始化a let a: UnicodeScalar = "a" print("a = \(a)") print("scalar value = \(a.value)") let pai = UnicodeScalar("π") if let p = pai { print("pai = \(p)") print("scalar value = \(p.value)") } let 好: UnicodeScalar = "好" print("好 = \(好)") } /* UnicodeScalar可以表示字符,那么为什么还需要Character呢? 因为现在充斥着各种丰富的Emoji表情,光20位的码点已经无法满足需求了,需要Emoji已经用两个 码点进行表示了,比如各国的国旗。所以,swift中使用Character类型以覆盖所有的可被编码的字符。 也就是说,一个Characteru对象可包含多个UnicodeScalar对象。 */ //let flag: UnicodeScalar = "🇺🇸" //报错 Cannot convert value of type 'String' to specified type 'UnicodeScalar' (aka 'Unicode.Scalar') let flag: Character = "🇺🇸" print("flag: \(flag)") // 通过码点来构造UnicodeScalar类型的对象。 let c = UnicodeScalar(127464)! let n = UnicodeScalar(127475)! print("c = \(c), n = \(n)") //我们将两个UnicodeScalar对子昂的字符对象拼在一起,构成一个String对象,然后用Character //构造方法将这个String对象中的内容转换为Character相应的值。 let cn = Character(String([Character(c),Character(n)])) print("cn = \(cn)") // 2. 转义字符 print("\n") print("---------转义字符-------------") /* 什么是转义字符? 转义字符用来表示这些无法在源代码中表示的特殊字符。 如何表示? swift中使用反斜杠作为转义字符的引导前缀。 */ do { let s = "Say, \"Hello\",很好!" print(s) let a = "🇺🇸".unicodeScalars.first?.value let b = "🇺🇸".unicodeScalars.last?.value print("a = \(a), b = \(b)") } //3. 字符串(String) do { // 空字符串 let a = "" print(a) let b = String() print(b) let c = "hello" print(c) let d = "你好" print(d) // 常用属性 //1. 拼接字符串 let e = c + d print("e = \(e)") //2. +=拼接 var f = "aaa" f += "bbb" print("f = \(f)") //3. == 比较 if a == b { print("字符串相等") } else { print("不相等") } //4. 判断是否为空字符串 if a.isEmpty { print("a是空字符串") } else { print("非空字符串") } //5. 包含子串 if f.contains("a") { print("包含子串") } else { print("不包含子串") } //6.是否以某字符串开头 if f.hasPrefix("a") { print("以a开头") } else { print("不是以a开头") } //7. 是否以某字符串结尾 if f.hasSuffix(".mp4") { print("结尾包含.mp4") } else { print("结尾不包含.mp4") } } // 4. 字符串插值 /* 什么是字符串插值? swift语言提供了一种十分便利的方式可以将几乎任一类型的对象转换为一个字符串的表示形式, 这就叫做字符串插值。 其实,我们在之前的打印中已经多次用到了字符串插值,只是没有提出这一概念。 语法:(Obj) */ do { let x = 10, y = 20 let s = "x + y = \(x + y)" print("s is \(s)") // 或 print("s is:" + s) // 自定义类型 struct MyType { var x = 10, y = 20 } let str = "my type: \(MyType())" print("自定义类型: \(str)") // 自定义类型定制字符串表达描述 struct MyStruct: CustomStringConvertible { var a = 10 var b = 20 var description: String { return String("MyStruct: a = \(a), b = \(b)") } } var obj = MyStruct() obj.a = -obj.a obj.b *= 2 print("哈哈哈,自定义: \(obj)") } // 5.字符串的characters属性 /* 如果我们想要迭代访问一个字符串的每个字符,或者是查询当前字符串中包含了多少字符个数,那么我们可以访问 String对象的characters属性。 注意:characters属性是swift3.2以下的属性,之后就不建议使用了。 我们在这里简单了解以下。 @available(swift, deprecated: 3.2, message: "Please use String or Substring directly") public var characters: String.CharacterView */ do { var str = "看看旗帜1:\u{1f1e8}" print("count: \(str.count)") print("before appending :", separator: "",terminator: "") // 输出字符序列 for ch in str.characters { print("\(ch)", separator: "", terminator: " ") } print("\n") //新增一个字符 str.append("\u{1f1f3}") //输出当前字符串中字符个数 print("count: \(str.count)") for ch in str { print("\(ch)", separator: "", terminator: " ") } let str2 = "看看旗帜2:\u{1f1e8}\u{1f1f3}" print("count: \(str2.count)") print(str2) // 字符串的最后和第一个字符属性 print("第一个字符: \(str2.first ?? " " )") print("最后一个字符: \(str2.last ?? " " )") // 注意:first和last属性都是返回的可选类型 } // 6. 字符串的索引以及字符访问 /* 注意:我们不能通过下标索引的方式访问字符串中的指定位置的字符,那么我们该如何访问单独的字符呢? swift编程语言为string类型引入了索引类型String.Index用于表示字符串对象中字符序列的索引值。 由于String.Index类型遵循了Comparable协议,所以它可以作为范围操作符的操作数。 swift中String.Index的声明如下: /// A position of a character or code unit in a string. public struct Index { } */ do { // 常用属性 //1.开始位置,结束位置 var str = "00000000000000000000" let start = str.startIndex let end = str.endIndex //2.获得指定的索引值 // index( _ , offsetBy: _) // 第一个参数:开始位置 // 第二个参数:偏移量,为正数:返回的索引值往后挪n位,为负数:往前挪n位。 let index = str.index(start, offsetBy: 5) str.insert("1", at: index) print("newstr: \(str)") // newstr: 000001000000000000000 /* index(_, offsetBy: _, limitedBy: _) 作用与 index( _ , offsetBy: _) 一样。 第一个参数:开始位置 第二个参数:偏移量 第三个参数:边界检测,如果索引计算的结果超过了边界,此方法就会返回空,因此返回值是一个可选值。 */ if let index2 = str.index(end, offsetBy: -5, limitedBy: start) { str.insert("2", at: index2) print("str2: \(str)") //str2: 0000010000000002000000 } //3.Substring类型 /* public struct Substring : StringProtocol { .... } Substring类型的对象是一个优化过的子串对象模型,它不仅具有String几乎全部的属性和方法 ,而且它共享了其原始字符串的存储空间,使得对它的操作非常快捷。 */ let myString = "好好学习,天天向上,每天都是好天气。🇨🇳" let startIndex = myString.startIndex let endIndex = myString.endIndex let index3 = myString.index(startIndex, offsetBy: 3) let index10 = myString.index(startIndex, offsetBy: 10, limitedBy: endIndex) if let temp = index10 { let subStr = myString[index3 ..< temp] var ch = subStr.first print("first = \(ch ?? " " )") ch = subStr.last print("last: \(ch ?? " " )") } /* 注意: endIndex属性指定的是字符串中最后一个字符的后一个索引位置,所以该属性的前一个位置才是此字符串 中的最后一个字符的位置,这一点一定要注意。 */ }

优秀的个人博客,低调大师

swift4.1 系统学习四

// // main.swift // swift04 // // Created by iOS on 2018/9/21. // Copyright © 2018年 weiman. All rights reserved. // import Foundation /* swift学习笔记4-2 */ //一、收集类型 // 数组(Array),集合(Set),字典(Dictionary) print("-----------------1.数组---------------------") //1.数组 //概念:数组是一个可以存放相同类型的多个元素对象的有序线性列表,这些元素对象可以是任意类型,包括元组。 do { // 声明一个空数组 let a = Array<Int>() let b: [Int] = [] let c = [Int]() print("a: \(a), b:\(b),c:\(c)") //a: [], b:[],c:[] // 声明非空数组 let d = [Double](repeating: 3.0, count: 10) print("d:\(d)") //d:[3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0] let e = [(Int, Double)](repeating: (1, 0.6), count: 5) print("e: \(e)") //e: [(1, 0.6), (1, 0.6), (1, 0.6), (1, 0.6), (1, 0.6)] let f = [1.0, 0.3, 0.4, 0.8, 1.2] print("f:\(f)") //f:[1.0, 0.3, 0.4, 0.8, 1.2] // 通过+操作符构建新的数组 let g = [1, 2, 3] let h = [4, 5, 6] let i = g + h print("i: \(i)") //i: [1, 2, 3, 4, 5, 6] //数组之所以能够相加,是因为Array声明了 + 这个方法 /* public static func + <Other>(lhs: Array<Element>, rhs: Other) -> Array<Element> where Other : Sequence, Element == Other.Element */ } // 数组元素的访问 do { //通过下标操作符访问数组元素 let a = [1, 2, 3, 4, 5] let x = a[0] let y = a[2] print("x:\(x), y:\(y)") //注意:只有遵循了Collection协议的类型对象才能作为下标操作符的操作数。 } // 数组的常用属性 do { //1. 获取元素个数 let a = [1, 2, 3, 34,5] print("个数: \(a.count)") //2. 判断数组是否有元素 print("是否为空: \(a.isEmpty)") //3. 是否包含某元素 print("是否包含3: \(a.contains(3))") //4. 增加元素 var b = [1, 2, 3, 4, 5, 6] //在数组最后增加新元素 b.append(100) print(b) //在数组中间插入新元素 b.insert(0, at: 0) print(b) //移除索引为2的元素 b.remove(at: 2) print(b) } // 注意:使用数组的时候,一定要注意数组的越界问题,一旦越界,会造成崩溃 print("-----------------2.集合---------------------") // 2. 集合 /* 概念: 集合:能够存放多个相同类型元素的集合。 与数组不同点: 1.集合中不允许出现两个完全相同的元素; 2.几个钟的数据元素是无序的; 3.并不是所有类型的对象都能作为集合的元素,只有遵循了Hashable协议类型的对象才能作为集合的元素。 swift中的基本类型(String,Int,Float,Double,Bool)都遵循了Hashable协议。 */ do { let a = [1, 2, 3, 4, 5, 5] let b: Set = [1, 2, 3, 4, 5, 5] print(a) print(b) /* 输出: [1, 2, 3, 4, 5, 5] [5, 3, 1, 4, 2] */ //Int类型的空集合 var setA = Set<Int>() //创建含有不定元素个数但是包含某些元素的集合 setA = Set<Int>(arrayLiteral: 1 ,2, 3) print(setA) } //对集合元素的访问 /* 注意: 集合是无序的,所以不能通过下标访问集合的元素。集合对元素的存放不是基于索引,而是基于哈希值。 访问集合的方法: 1.for-in循环 2.flatMap方法 */ //常用属性 do { //1.元素个数 let a: Set = [1, 2, 3, 4, 5, 6] print("个数: \(a.count)") //2.是否为空 print("是否为空集合: \(a.isEmpty)") //3.是否包含某个元素 print("是否包含: \(a.contains(5))") //4.插入元素 //注意:集合插入的元素位置不定 var b: Set = ["a", "b"] b.insert("c") print(b) //5.删除元素 b.remove("b") print(b) //6.自定义类型对象作为集合的元素 struct MyStruct: Hashable { // 定义属性 var a = 0 var b = 0.0 // 只是demo,实现hashValue方法 public var hashValue: Int { return a.hashValue ^ b.hashValue } // 实现Equatable协议中的 == 操作符类型方法 public static func == (lhs: MyStruct, rhs: MyStruct) -> Bool { return lhs.a == rhs.a && lhs.b == rhs.b } } var set = Set<MyStruct>() let e1 = MyStruct(a: 10, b: 1.0) let e2 = MyStruct(a: -10, b: 0.5) print("e1: \(e1)") print("e2: \(e2)") // 插入对象 set.insert(e1) set.insert(e2) print("set = \(set)") //7.两个集合相等 let s1: Set = [1, 2, 3] let s2: Set = [3, 2, 1] if s1 == s2 { print("s1 == s2") } } print("-----------------3.字典---------------------") //3. 字典 /* 概念:字典也是无序集合。不过字典与数组和集合不同,存储的是键值对。 注意: 1.字典中的键的类型和值的类型都是在声明中直接确定的。 2.键的类型必须遵循Hashable协议。 3.值的类型可以是任意类型. */ do { // 创建字典 // 创建一个键是string类型,值是Int类型的空字典 var a = Dictionary<String, Int>() a = ["a": 1] print(a) // 通过字典的不定参数个数的构造方法创造一个字典 let b = Dictionary<String, Int>(dictionaryLiteral: ("one", 1), ("two", 2)) print(b) // 默认构造方法创造字典 let c = [Int: Float]() print(c) // 通过字典字面量创建字典 var d: [String: Int] = [:] print(d) d = ["age": 18, "num": 100] print(d) } do { // 访问字典的元素 var dict:[String: Any] = ["name": "小明", "age": 20, "score": 100, "new": true] if let name = dict["name"] { print(name) } dict.updateValue("王小明", forKey: "name") print(dict) let test = dict["test"] print(test ?? "没有这个值") } do { // 常用属性 var dict: [String : Any] = ["name": "Lili", "age": 10, "class": "1班", "from": "England"] // 1.元素个数 print("元素个数: \(dict.count)") // 2.是否为空 print("是否空: \(dict.isEmpty)") // 3. 所有的键 print("所有的键: \(dict.keys)") // 4. 所有的值 print("所有的值: \(dict.values)") // 5. 更新值 dict.updateValue("2班", forKey: "class") print("更新后: \(dict)") dict["age"] = 11 print(dict) // 6.新增键值对 dict["interest"] = "看动漫,爬山" print(dict) // 7.删除 dict.removeValue(forKey: "class") print(dict) }

优秀的个人博客,低调大师

swift4.1 系统学习五

简单的代码也要亲自实现看看。 //1. 范围操作符 这是一个新的概念,在swift中常常使用。 1.闭区间范围操作符:(...),例如: a...b 在数学中的含义是[a,b] 2.半开区间范围操作符: (..<), 例如, a..<b在数学中的含义是[a, b) 这两种类型都属于结构体类型。 注意: 1.范围操作的两个操作数都要遵循Comparable协议,即要能比较出大小; 2.左边的值必须小于等于右边的值; // // main.swift // swift05 // // Created by iOS on 2018/9/25. // Copyright © 2018年 weiman. All rights reserved. // import Foundation //swift学习笔记5 // 应用实例 let stringRange = "aaa"..."ccc" print(stringRange) let charRange = Character("a")..<Character("c") print(charRange) switch "ccb" { case stringRange: print("在stringRange范围内") default: print("不在stringRange范围内") } switch Character("b") { case charRange: print("在 charRange 内") default: print("不在 charRange 内") } // 通过for-in循环依次输出range内的值 for i in 0...10 { print("i = \(i)") } print("\n") for i in 0..<10 { print("i = \(i)") } let array = [1, 2, 3, 4, 5, 6, 7, 8] let range = 1...4 //取数组的子数组 let subArray = array[range] print("子数组: \(subArray)") print("上边界: \(range.upperBound)") print("下边界:\(range.lowerBound)") print("是否为空: \(range.isEmpty)") // 2. 单边范围操作符(swift4.0以后) /* 只对范围操作数的一端设置操作数,另一端缺省。 三种类型: a... : 大于等于a的范围 , >=a ...b : 小于等于b的范围, <=b ..<b : 小于b的范围,<b 应用: 获取数组的子数组,获取字符串的子串 */ do { let array = [1, 2, 3, 4, 5, 6, 7, 8, 9] //1. 取array从索引2到最后一个元素的子数组 let sub1 = array[2...] print("sub1: \(sub1)") //2. 取从0开始到第6个位置的子数组 let sub2 = array[...6] print("sub2: \(sub2)") //3. 取从索引0到5,不包括5的子数组 let sub3 = array[..<5] print("sub3: \(sub3)") } /* 注意: 由于单边操作符不能表示一个有限范围的值,因为它不能遵循Sequence协议, 从而我们不能将它们用在for-in循环中。 */

优秀的个人博客,低调大师

swift4.1 系统学习二

// // main.swift // swift02 // // Created by iOS on 2018/9/21. // Copyright © 2018年 weiman. All rights reserved. // import Foundation /* swift学习笔记3 */ /* 1. 整数字面量 表示方式: 二进制(0b)、八进制(0o)、十进制、十六进制(0x) */ let dec = 100 let bin = 0b0110_0100 let oct = 0o144 let hex = 0x64 //思考:还记得进制之间的转换吗? /* 十进制转二进制:除以二取余数 二进制转八进制:从右到左,依次取三位,最后一组不够三位用0补足,每一组的每个位置加起来,然后组合在一起,就是八进制了 二进制转十六进制:与八进制类似,不过是依次取四位 */ /* 2. 整数类型(Int) */ //打印本机Int类型的表示范围 let max = Int.max print("max: \(max)") //max: 9223372036854775807 let min = Int.min print("min: \(min)") let a: Int8 = 127 let b: UInt8 = 255 // 注意:对于固定位宽的整数类型,赋值的时候要注意他们的表示范围,不要超出表示范围,不然会报错 // 报错:Integer literal '200' overflows when stored into 'Int8' // let aa: Int8 = 200 // 3. 浮点数类型 do { let a: Float let b = 0.5 let c: Double let pi = 3.141592653 a = Float(b) c = pi print("\(a),\(b),\(c),\(pi)") } /* 注意:swift中没有隐式转换,不同类型之间一定要显示转换。这是为什么呢?因为通过查看swift的API发现,swift的Int,Float,Double都是Struct类型的独立类型,既然是独立类型,互相赋值的时候当然需要类型转换了。之所以能够顺利的进行转换,是因为在Float结构体中定义了下面这个方法: /// let x: Double = 21.25 /// let y = Float(x) /// // y == 21.25 /// /// let z = Float(Double.nan) /// // z.isNaN == true /// /// - Parameter other: The value to use for the new instance. public init(_ other: Double) Float(b) 相当于 Float.init(b),init是可以省略的 */ // 4. 布尔类型 /* 注意: swift的bool类型与C、OC以及C++不同,不再是非零为真,零为假,而是回归独立的类型, 只有true和flase两个类型,与整数完全分离。 */ do { let a = true let b = false //逻辑计算 print("a&&b: \(a&&b)") //a&&b: false print("a||b: \(a||b)") } // 5. 各种数值类型之间的转换 /* 注意:swift中各个数值类型都是struct类型的,是各自独立的类型,转换的时候需要使用构造方法进行显示转换。 swift中个的每种数值类型以及布尔类型还提供了一个可供NSNumber类型作为输入参数的构造方法。该构造方法可以通过NSNumber对整数或浮点数进行封装,然后内部采用高位截断或符号位扩充的形势转换为目标数据类型。 */ do { let n = 1000 let c = Int8(truncating: NSNumber(value: n)) print("----\(c)") } // 6. 计算操作符 // >, < , >=, <=, ==, != //7. 溢出计算操作 // swift中包含了允许计算时发生溢出的操作符,以允许开发者对整数做运算时发生结果溢出,而不引发异常。 // 可溢出加法:&+ // 可溢出减法:&- // 可溢出乘法:&* do { let a: Int8 = 120 let b: Int8 = 100 var c = a &+ b print(c) c = -100 &- a print(c) }

优秀的个人博客,低调大师

swift4.1 系统学习三

// // main.swift // swift03 // // Created by iOS on 2018/9/21. // Copyright © 2018年 weiman. All rights reserved. // import Foundation /* swift学习笔记4 */ // 1.元组 /* 元组是swift中一种复合类型。它很强大哦,可以吧任意类型的有限个对象整理为一个对象。 */ do { let a = 10 let b = "小花" let tuple = (a,b) print(tuple) print(tuple.0) } // 注意:如果我们要表示一个元组,那么圆括号中至少要有两个元素,否则,圆括号被看做是圆括号操作符。 //1》访问元组中的元素 //要访问元组的对象,可以使用成员访问操作符.,后面跟上元素的索引位置。 do { let tuple = ("小明","男",8,"北京") print(tuple.0) //输出 “小明” let sex = tuple.1 print(sex) } //我们还可以给元组指定标签进行访问 do { let tuple = (name: "老王", age: 78, address: "上海市") print(tuple.name) print(tuple.age) print(tuple.address) } //2》元组分解 do { let tuple = (10, 20.6, true) let (i, d, b) = tuple print("i = \(i)") print("d = \(d)") print("b = \(b)") // 提取部分值 let (x, _, y) = tuple print("x = \(x)") print("y = \(y)") // 交换两个对象的值 var w = 1, n = 2 (w, n) = (n, w) print("w:\(w), n:\(n)") } //注意: 上面声明的(i, d, b)并不是元组,而是三个常量,用于萃取元组中的元素。 //3》元组比较 //两个相同元素类型的元组,如果每个元素都遵循了Equatable协议,那么这两个元组对象可以用==或者!=操作符来比较是否相等。 /* 元组相等: 如果元组的每一个元素的值都是相等的,那么这两个元组相等。 */ do { var a = 10 let result: Void = a += 100 print("result: \(result), a: \(a)") //result: (), a: 110 let obj: Any = result let isVoid = obj is Void print("obj:\(obj), isVoid:\(isVoid)") //obj:(), isVoid:true } //4》 元组计算顺序 do { var loop = 3 repeat { print("Hello,world") print("loop: \(loop)") } while(loop -= 1, loop).1 > 0 /* Hello,world loop: 3 Hello,world loop: 2 Hello,world loop: 1 */ //元组的计算顺序是从左到右进行计算的,从第一个元素到最后一个元素。 }

优秀的个人博客,低调大师

swift4.1 系统学习一

/* swift学习笔记1 简介 swift出现的目的:为了简化macOS和iOS开发 特点: 1.开源 2.跨平台 3.面向对象的编程语言 4.编程范式丰富:面向过程,面向对象,函数式编程 5.安全性 */ /* swift学习笔记2 基本类型体系 1.枚举(enum) 2.结构体(struct) 3.类(class) 4.协议(protocol) 5.函数(function) 6.复合类型:元组(tuple) 注意:这里并没有像别的语言那样,把基本数据类型和用户自定义数据类型分类。 值类型:枚举和结构体 引用类型:类和函数 抽象接口类型:协议 协议到底是值类型还是引用类型要取决于所引用的对象的实际类型。 */ //1. 变量 var var a = 1 a = 2 //2. 常量 let let b = 10 //b = 8 //报错 //3. 对象声明与类型标注 //swift具有强大的“类型推导”功能,可以根据声明的对象的初始化的值来推导出对象的类型。 //4. 下划线 //在swift中,下划线具有特殊的含义——表示“通配符”。一般用于对象声明中表示一个缺省对象。 //5. 表达式 /* 四类: 1.前缀表达式 单目操作符、try操作符 2.双目表达式 双目操作符、三目操作符、类型投射操作符 3.基本表达式 字面量、self 表达式、超类表达式、闭包表达式、圆括号表达式、元组表达式、隐式成员表达式、通配符表达式、selector表达式、key-path表达式 4.后缀表达式 函数调用表达式、初始化器表达式、动态类型表达式、下标表达式、optional表达式 */ // 对于关键字作为标识符,可以使用’‘ let `var` = 0 print("\(`var`)") //6. 注释 /// 这是一个注释 /// 这又是一条注释 /// - author: wm func foo() { } foo() /// 这是一个函数 /// /// - Parameter obj: 一个整数对象 func foo(with obj: Int) { } /// 这又是一个函数 /// /// - Parameters: /// - a: 浮点型的对象 /// - b: 浮点型的对象 /// - Returns: 一个整数对象 /// - Throws: 可能会抛出异常 func foo(a: Float, b: Float) throws -> Int { return Int(a + b) } 按住键 option ,点选对应的函数名,可以看到注释。 image.png

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。