swift笔记简录
一,变量和常量
/***************************基本数据类型*************************/
/**************************************************************
1.整数: Int
2.浮点数: Double表示64位浮点数,Float表示32位浮点数
3.布尔类型: Bool,布尔值只有 true 和 false 两种
4.字符串: String
5.字符: Character
***************************************************************/
/***************************变量和常量*************************/
/***************************************************************
1.变量:值能被修改,var 修饰
2.常量:值不能被修改,let 修饰
***************************************************************/
var a = 20
a = 10
let b = 20
//b = 10 常量不能修改:error:'b' is a 'let' constant
/****************************************************************
1.会自动推导声明的变量或常量的属性
2.使用【option + 单击】键查看属性的类型,效果图见:Resources/查看属性.png
****************************************************************/
// 1.自动推导类型
let str = "ningcol"
let intValue = 10
let floatValue = 1.2
// 2.指定数据类型
let doubleValue:Double = 10
二,运算符
/**************************基本运算符*************************/
var a = 5
let b = 3
// 1.赋值运算符
let c = b
// 2.加减乘除
1 + 2
5 - 3
2 * 3
10.0 / 2.5
// 2.1 任何情况下都不会做隐式转化,必须以相同类型进行计算
let num1 = 1
let num2 = 2.2
let num3 = Double(num1) + num2
// 2.2 必须要显式类型的转化
let j = 2.2
let i:Float = 1.2
i + Float(j)
// 3.求余运算
a % b
// 4.负号运算
let minusB = -b
// 5.组合赋值运算
a += 2
// 6.比较运算
1 == 1
2 != 1
2 > 1
1 < 2
1 >= 1
2 <= 1
// 7.三目运算
let d = a > b ? 100 : 200
// 8.空合运算(Nil Coalescing Operator)
/*********************************************************************
1.空合运算符( a ?? b )将对可选类型 a 进行空判断(可选项内容详见:04-可选项)
2.如果 aName 为 nil,则执行??后面的,否则执行aName(注意??两边都有空格)
********************************************************************/
var aName: String? = "ningcol"
//var aName: String? = nil
let bName = aName ?? "aNameIsNil"
// 9.区间运算
/*********************************************************************
1.闭区间运算符( a...b )定义一个包含从 a 到 b (包括 a 和 b )的所有值的区间
2.半开区间( a..<b )定义一个从 a 到 b 但不包括 b 的区间
********************************************************************/
for index in 1...5 {
print(index)
}
for index in 1..<5 {
print("半开区间:\\(index)")
}
// 10.逻辑运算
/*********************************************************************
1.逻辑非(!a):布尔值取反
2.逻辑与( a && b ):只有 a 和 b 的值都为 true 时,整个表达式的值才会是 true
3.逻辑或( a || b ):两个逻辑表达式的其中一个为 tru e ,整个表达式就为 true
********************************************************************/
let allowedEntry = false
let enteredDoorCode = true
if !allowedEntry {
print("ACCESS DENIED")
}
if allowedEntry && enteredDoorCode {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
if allowedEntry || enteredDoorCode {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
三,可选项
/***************************可选项*************************/
/*********************************************************************
1.可选值:可以有值,可以为nil(用 ? 表示可选值)
********************************************************************/
// URL 为可选项
let URL = NSURL(string: "http://www.baidu.com/")
// str 为可选项
var str: String? = "ningcol"
// var 的可选项默认为 nil
var a:Int?
print(a)
/*************************** if let *************************/
// if let : 确保 myUrl 有值,才会进入分支
if let myUrl = URL{
print(myUrl)
}
var aName: String? = "ningcol"
// var aName: String? = nil
var aAge: Int? = 18
if let name = aName,let age = aAge {
print(name + String(age))
}
// 可以对值进行修改
if var name = aName,let age = aAge {
name = "lisi"
print(name + String(age))
}
/*************************** guard let *************************/
/*********************************************************************
1.guard let 和 if let 相反。表示一定有值,没有就直接返回
2.降低分支层次结构
3.playground不能展示效果,要在函数中展示
********************************************************************/
// 创建一个类(详见:10-对象和类)
class test{
func demo(){
let aNick: String? = "ningcol"
let aAge: Int? = 10
guard let nick = aNick ,let age = aAge else {
print("nil")
return
}
print("guard let: " + nick + String(age))
}
}
var t = test()
t.demo()
/*******************************强制解包***************************************/
// 创建一个数组(详见:08-组数)
var dataList:[String]?
dataList = ["zhangsan","lisi"]
/*********************************************************************
1.dataList? 表示 datalist 可能为 nil
2.如果为 nil, .count 不会报错,仍然返回 nil
2.如果不为 nil,.count执行,返回数组元素个数
4. ?? 空合运算符(详见:02-运算符)
*********************************************************************/
let count = dataList?.count ?? 0
// 表示 datalist 一定有值,否则会出错!
let cou = dataList!.count
四,条件语句
/**************************if语句*************************/
/*********************************************************************
1.必须要有大括号
2.没有"非零即真"的概念,只有ture/false
*********************************************************************/
let num = 20
if num > 10{
print("大于10");
}else{
print("小于或等于10")
}
/**************************switch*************************/
/*********************************************************************
1.值可以是任何类型
2.作用域仅在 case 内部
3.不需要 break
4.每一个 case 都要有代码
*********************************************************************/
let name = "nick"
switch name {
case "nick":
let age = 18
print("one \\(age)")
case "fil":
print("two")
case "Davi":
print("three")
case "": break //相当于有一行代码
case "tom","ningcol":
print("tomAndNingcol")
default:
print("other")
}
五,循环
/***************************for循环*************************/
// 去掉了C语言风格的循环( ..< 区间运算符,详见:02-预算符)
for i in 0..<10{
print(i)
}
print("----步长循环-----")
// 递增(步数为2)
for i in stride(from: 0, to: 12, by: 2) {
print(i)
}
// 递减
for i in stride(from: 12, to: 0, by: -2) {
print(i)
}
print("----反序循环----")
let range = 0...10
// 反序循环
for i in range.reversed(){
print(i)
}
/***************************while循环*************************/
print("----while循环----")
var n = 2
while n < 100 {
n=n * 2
}
print(n)
/***************************epeat-while循环*************************/
//它和 while 的区别是在判断循环条件之前,先执行一次循环的代码块。然后重复循环直到条件为 false
var m = 2
repeat {
m = m * 2
} while m < 100
print(m)
六,字符串
/**********************************************************************
1.String 结构体,效率比对象高,一般推荐使用,支持遍历
2.NSString 继承NSObject
**********************************************************************/
var str:String = "Hello你好"
//var st:NSString = "hah"
// 字节数量
print(str.lengthOfBytes(using: .utf8))
// 字符串长度
print(str.characters.count)
for a in str.characters{
print(a)
}
// 字符串拼接
let name:String? = "老王"
let age = 80
let location = "隔壁"
print(location + (name ?? "a") + String(age) + "岁")
// '\\(变量名)' 会自动转换拼接
print("\\(location)\\(name)\\(age)岁")
let rect = CGRect(x: 0, y: 0, width: 100, height: 100)
print("\\(rect)")
// 格式字符串
let h = 13
let m = 5
let s = 9
let timeStr = String(format: "%02d:%02d:%02d", arguments: [h,m,s])
let timeStr1 = String(format: "%02d:%02d:%02d", h,m,s)
/**********************************************************************
1.在Swift中使用 Range,最好把 String 改成 NSString
2.str.substring(with: Range<String.Index>) 很麻烦
3. '值 as 类型' 作为类型转换
**********************************************************************/
(str as NSString).substring(with: NSMakeRange(2, 5))
let index = str.index(str.startIndex, offsetBy: 3)
str.substring(from: index)
// "123"只是用来取到索引位置
str.substring(from: "123".endIndex)
str.substring(to: index)
// String 使用 Range
let myRange = str.startIndex..<str.index(str.startIndex, offsetBy: 5)
str.substring(with: myRange)
let myRange1 = index..<str.index(str.startIndex, offsetBy: 5)
str.substring(with: myRange1)
七,元组
// 元组的元素个数固定,不允许增加、删除
var stu = (404,"小白")
// 支持嵌套
var msg = ("基本信息", ("李刚",34))
print(stu)
print(msg)
var (a,b) = stu
print(a,b)
//如果仅需要元组中的个别的值,可以使用"_"的方式来处理不需要的值
let (c,_) = stu
print(c)
//通过序号获得元组的值
print("status is \\(stu.0)")
// 可以修改
stu.0 = 500
let message = (status: 100, msg:"哈哈")
print("message is \\(message.status) and \\(message.msg)")
八,数组
/***************************数组定义*************************/
//方括号 [] 来创建数组
let array1 = ["zhangsan","lisi"]
let array2 = [1,2,3,4,5]
var array3:[Int] // 定义一个数组(没有初始化)
array3 = [Int]() //初始化
//声明空数组,(必须初始化)
let array4 = [String]() // 等价上面两行代码
let array5:[Any] = ["zhangsan","lisi",20]
var arr3 = [Double](repeating: 0.0, count: 3) //[0.0, 0.0, 0.0]
var arr4 = Array(repeating: 3.0, count: 3) //[3.0, 3.0, 3.0]
var arr: [String] = ["Alex", "Brian", "Dave"]
print(arr.count)
print(arr[0])
/***************************数组遍历*************************/
for name in array1{
print(name)
}
for i in 0..<array2.count{
print(array2[i])
}
// 同时遍历下标和内容
for e in array2.enumerated(){
print(e)
print("元组 \\(e.offset) \\(e.element)")
}
// 反序遍历
for a in array2.reversed(){
print(a)
}
/***************************数组增删改*************************/
// 追加
arr.append("ningcol")
// 合并(类型必须一致)
let arr1 = ["Evi","Tank"]
arr += arr1
// 修改
arr[0] = "Tom"
print(arr)
// 删除
arr.removeFirst()
print(arr)
arr.remove(at: 2)
print(arr)
// 删除全部并保留空间
arr.removeAll(keepingCapacity: true)
print(arr.capacity) //数组容量
/***************************容量*************************/
// 容量每次都会在原来基础上 * 2
print("初始容量 \\(array3.capacity)")
for i in 0..<8{
array3.append(i)
print("\\(array3),容量:\\(array3.capacity)")
}
九,字典
/***************************字典定义*************************/
//方括号 [] 来创建字典
let dict1 = ["name":"lisi","age":"18"]
// 不同类型必须指明为 any
var dict2:[String:Any] = ["name":"lisi","age":18]
let array = [
["name":"lisi","age":"18"],
["name":"wangwu","age":8]
]
print(array)
let array1:[[String:Any]] = [
["name":"lisi","age":"18"],
["name":"wangwu","age":8]
]
print(array1)
print(dict2["age"])
/***************************字典增删改*************************/
// 增加
dict2["sex"] = "man"
print(dict2)
// 修改(通过key来取值,key不存在就是新增)
dict2["name"] = "zhangsan"
print(dict2)
// 删除(直接给key进行删除)
dict2.removeValue(forKey: "age")
print(dict2)
/***************************字典遍历*************************/
for e in dict2{
//e 为元组
print("字典遍历:\\(e) e.key:\\(e.key) value:\\(e.value)")
}
// key value 可以随意更改
for (key,value) in dict2{
//e 为元组
print("key:\\(key), value:\\(value)")
}
/***************************字典合并*************************/
var dict3:[String:Any] = ["name":"zhangsan","age":18,"sex":"man"]
let dict4:[String:Any] = ["name":"ningcol","height":50]
// 如果key存在修改 不存在会增加
for e in dict4{
dict3[e.key] = dict4[e.key]
}
print("合并dict:" + String(format: "%@", dict3))
十,对象和类
// 创建一个类
class Shape {
var numberOfSides = 0
// 定义 simpleDescription 无参方法,返回值为 String 类型
func simpleDescription() -> String {
return "A shape with \\(numberOfSides) sides."
}
}
// 实例化
var shape = Shape()
// 赋值
shape.numberOfSides = 7
// 调用方法
var shapeDescription = shape.simpleDescription()
// 构造函数来初始化类实例
class NamedShape {
var numberOfSides: Int = 0
var name: String
init(name: String) {
self.name = name
}
func simpleDescription() -> String {
return "A shape with \\(numberOfSides) sides."
}
}
// 重写父类方法
class Square: NamedShape {
var sideLength: Double
init(sideLength: Double, name: String) {
self.sideLength = sideLength
super.init(name: name)
numberOfSides = 4
}
func area() -> Double {
return sideLength * sideLength
}
// 使用 override
override func simpleDescription() -> String {
return "A square with sides of length \\(sideLength)."
} }
let test = Square(sideLength: 5, name: "my test square")
test.area()
test.simpleDescription()
十一,控件
// 创建一个 View
let v = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
let u = UIView()
// [UIColor redColor] 类方法:直接点出来
v.backgroundColor = UIColor.red
// 创建一个按钮
let btn = UIButton(type: .contactAdd)
// 将 btn 添加到 View 上
btn.center = v.center
v.addSubview(btn)
swift笔记简录的更多相关文章
- [Swift] Swift笔记
开始整理Swift笔记了.打算直接用Playground去写,里面自带的Markup语法和Markdown差不多,显示的效果也不差于博客.而且用Xcode看代码也方便.所以这部分内容不再在博客里记录了 ...
- Unity亚洲开发者大会会议简录之技术篇,Profiler的一些参数的意思
2014Unity亚洲开发者大会会议简录之技术篇 拖公司的福,有幸去了一趟北京参加了一场Unity3D的交流盛宴,在为期两天的时间内,不仅有着技术上收获,也有心灵上的震撼.现在先来说说技术方面的一些比 ...
- 从0开始学Swift笔记整理(五)
这是跟在上一篇博文后续内容: --Core Foundation框架 Core Foundation框架是苹果公司提供一套概念来源于Foundation框架,编程接口面向C语言风格的API.虽然在Sw ...
- 从0开始学Swift笔记整理(四)
这是跟在上一篇博文后续内容: --重写方法 重写实例方法 在子类中重写从父类继承来的实例方法和静态方法.先介绍实例方法的重写. 下面看一个示例: class Person { var n ...
- 从0开始学Swift笔记整理(三)
这是跟在上一篇博文后续内容: --Swift中相关的属性 存储属性 Swift中的属性分为存储属性和计算属性,存储属性就是Objective-C中的数据成员,计算属性不存储数据,但可以通过计算其他属性 ...
- 从0开始学Swift笔记整理(二)
这是跟在上一篇博文后续内容: --函数中参数的传递引用 类是引用类型,其他的数据类型如整型.浮点型.布尔型.字符.字符串.元组.集合.枚举和结构体全部是值类型. 有的时候就是要将一个值类型参数以引用方 ...
- 从0开始学Swift笔记整理(一)
Swift 是一种适用于 iOS 和 OS X 应用的全新编程语言,它建立在最好的 C 和 Objective-C 语言之上,并且没有 C 语言的兼容性限制.Swift 采用安全的编程模式,增加了现代 ...
- swift 笔记 (十八) —— 扩展
扩展 扩展能够让我们给一个已有的类.结构体.枚举等类型加入�新功能,包含属性和方法,甚至是构造器,下标,支持协议等等... 甚至是我们拿不到源码的类.结构体.枚举,我们依旧能够给它加扩展... 看到这 ...
- swift 笔记 (十二) —— 下标
下标 swift同意我们为 类.结构体,枚举 定义下标,以更便捷的方式訪问一大堆属性.比方Array和Dictionary都是结构体,swift的project师已经为这两个类型提供好了下标操作的代码 ...
随机推荐
- Codeforces Round #669 (Div. 2) C. Chocolate Bunny 题解(交互)
题目链接 题目大意 有一个长度为n的全排列,你可以询问2n次,要你经过这个2n次的询问后,求出这个全排列 询问定义为:输入"? i j"输出\(p_{i} mod p_{j}\) ...
- Java基础教程——网络基础知识
参考阅读[中国互联网发展史]:https://zhuanlan.zhihu.com/p/61602252 协议 计算机网络中的通信必须有一些约定,这些约定称为"通信协议". 通信协 ...
- 如何实现一个简易版的 Spring - 如何实现 Setter 注入
前言 之前在 上篇 提到过会实现一个简易版的 IoC 和 AOP,今天它终于来了...相信对于使用 Java 开发语言的朋友们都使用过或者听说过 Spring 这个开发框架,绝大部分的企业级开发中都离 ...
- 【Linux】Linux 资料大全(100% 纯干货)
作者:李春港 出处:https://www.cnblogs.com/lcgbk/p/14071875.html 本文章给大家分享一些 Linux 学习资料,包含:社区网站.在线教程.命令大全.在线模拟 ...
- 七牛云实现前端js上传实现办法
1.七牛云上传前台页面 1.1 安装相关包 npm install --save jquery@1.12.1 # 安装jquery 1.2 index.html 引入qiniu.min.js < ...
- Django----Modelviewset继承
1.modelviewset 认证.权限.限流.序列化.分页.过滤.排序 modelviewset的应用场景是: 1.主要应用于数据接口 2.对数据库的增删改查 3.在视图函数中没有很多业务逻辑需要来 ...
- 【NOIP2012模拟8.7】JZOJ2020年8月8日提高组T1 奶牛编号
[NOIP2012模拟8.7]JZOJ2020年8月8日提高组T1 奶牛编号 题目 作为一个神秘的电脑高手,Farmer John 用二进制数字标识他的奶牛. 然而,他有点迷信,标识奶牛用的二进制数字 ...
- 20190713_(转)IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决办法 (转)
此文为转载; 原文链接地址: https://www.cnblogs.com/mrma/p/3529859.html ----------------------------------------- ...
- Django-DRF框架
一.RESTfull设计风格 1.什么是RESTfull? 1)REST:即Representational State Transfer的缩写.维基百科称其为"具象状态传输",国 ...
- 第15.48节、PyQt显示部件:TextBrowser、CalendarWidget、LCDNumber、ProgressBar、Label、HorizontalLine和VerticalLine简
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.概述 在Designer中,显示部件有Labe ...