import Foundation
print("1","2","3","4");
//输出多个字符串,并用“***”并用 \n 换行
print("1","2","3","4", separator: "---", terminator: "\n")
//常量
let num = 120
//变量
var num2 = 18
num2 = 10
print(num,num2)
//类型安全和类型推断
let num3:Int = 18
//num3 = 3.14 类型不匹配
var num4:Float = 2123
//num4 = Int(4) 类型不匹配
//类型推断
//根据赋值推断出变量或常量的类型
var num5 = 19
let num6 = 3.14//Double
var char:Character = "C"
var char2 = "C"//String
var str = String("123123")
var str2 = "123123"//字面变量创建
let 二进制 = 010101
print(二进制)
let 八进制 = 0o11
print(八进制)
let 十进制 = 111
print(十进制)
let 十六进制 = 0x11
print(十六进制)
//数据类型转换
var t = 3
let t1 = 2.34
let result = Double(t) + t1
print("Double:\(result)")
let result2 = t + Int(t1)
print("result2:\(result2)")
let result3 = String(t)
print("String:\(result3)")
let result4 = Int("123")//返回值是可选类型
print(result4)//Optional(123)
let result5 = result4! + 5//可选类型不能直接参与运算,需要解包取出里面的值,再做运算
print(result5)
//布尔值 Boll 主要用作判断条件和循环条件,swift中不在有非零即为真
var flag = true
print(flag)
flag = false
print(flag)
if false{
print("永真")
}//认为不执行,白写
//while ture{
// print("死循环")
//}
//元组 Tuple 主要用来处理当一个函数需要多个返回值的情况
let tuple = (name:"里斯",age:18,123)
//访问元组的内容
//通过下标访问
print(tuple.0)
print(tuple.1)
print(tuple.2)
//通过元素访问
print(tuple.name)
print(tuple.age)
/*
func 函数名(参数列表) -> 返回值类型 {
函数体
}
*/
//求和函数
func sum(num1:Int,num2:Int) ->Int{
return num1+num2
}
print(sum(num1: 1, num2: 2))
//元组的使用场景
func backValue(num1:Int,num2:Int) -> (Int,Int){
return (num1+num2,num1-num2)
}
let tuple2 = backValue(num1: 12, num2: 3)
print(tuple2)
print(tuple2.0,tuple2.1)
//可选类型 Optional 可选类型主要用来处理可能缺失的情况
var aString:String? = nil//定义可选类型的字符串
var aInt:Int? = nil //定义一个可选类型的整数
aString = "JiNingShiFan"
print(aString)
//对一个值为空的可选类型进行解包是很危险的,解包前要判断是否有值,或者赋值
let newString = aString! + "IOS Class"
print(newString)
var sum = 0
//先判断可选类型是否为空,不为空才解包
if aInt != nil{
sum = aInt! + 10
}
print(sum)
//可选绑定
let str3:String? = "I love"
var str4 = ""
//系统内部就帮我们把可选类型str3值解包出来了,不需要手动再解包,如果str3值不为空,if的条件为true,如果str3的值为空,if就是false,则不执行if语句
if let vauleString = str3{
str4 = vauleString + " XiangLaoShi"
}
print(str4)
//隐式解包类型
//隐式解包类型要求必须赋值,才能使用,nil也可以
var v:Int! = nil
//此时再使用v中的值时,就不能再使用!解包了,因为已经解包过了
v = 18
let value = v + 12
print(value)
//for循环
//for C语言的格式已经被弃用了
//for(i:Int;i<10;i++){
//
//}
//使用for循环输出1到10
//...代表闭区间[1,10]
for i in 1...10{
print(i)
}
//使用for输出1到9
//..<代表开区间[1,10)
for i in 1..<10{
print(i)
}
//输出10遍Hello World
//如果没有使用到循环变量,可以用下划线 _ 替换掉
for _ in 1...10{
print("Hello World")
}
//求1~100的和
//定义变量存储最终的结果 sum1
var sum1 = 0
//利用for循环遍历1~100,并把结果放到sum1中
for i in 1...100{
sum1+=i
}
print(sum1)
//repeat-while循环
var m = 0
repeat {
print("班里美女好多")
m += 1// ++ 和 -- 已经被弃用了
}while m < 10
//创建字符串
let s1 = "字面量格式创建"
print(s1)
//使用初始化方法创建
let s2 = String("初始化方法创建")//创建出来的是可选类型字符串
print(s2!)
//操作字符串方法和属性
let s3 = "Hello World"
//获取字符串的长度
print(s3.characters.count)//先获取字符,再count获取长度
//大写字符串的方法
let nStr = s3.uppercased()
print(nStr,s3)
//小写字符串的方法
let nStr2 = nStr.lowercased()
print(nStr2,nStr)
//字符串拼接
var s4 = "zhangquandan"
s4.append(" funtukang")//拼接内容直接作用到原串上了
print(s4)
let nStr3 = s4.appending(" qipashuo")//拼接的内容没有作用到原串上,而是返回一个新的字符串
print("nStr3"+nStr3,"s4"+s4)
//遍历字符串
let s5 = "We are fimily"
for char in s5.characters{
print(char)
}
//字符串的格式化拼接
for i in 1..<10{
let str = String(format: "student%02d", i)//%02d占位符及所占位置
print(str)
}
//数组 Swift创建数组一定要制定存放的元素类型let arr1 = [Int]()var arr2 = [String]()//添加元素arr2.append("zhangsan")print(arr2)arr2[0] = "Lisi"print(arr2)//字面量创建数组var arr3 = ["zhangsan","Lisi","wanger","mazi"]//删除//根据下标删除arr3.remove(at: 0)print(arr3)//删除最后一个元素arr3.removeLast()//arr3.remove(at:2)//删除第一个元素arr3.removeFirst()//删除所有元素arr3.removeAll()//获取元素个数print(arr3.count)print(arr3)//数组遍历var arr4 = ["huaqiangu","shaqianmo","dongfangyuqin","tangbao","zunshang"]for item in arr4{ print(item)}for (i,Item) in arr4.enumerated(){ print("item:\(Item)index:\(i)")}//数组排序arr4.sort()print(arr4)var numArr = [8,4,3,7,2,1]//冒泡排序:外层控制比较趟数,内层控制比较次数//外层控制比较的趟数for i in 0..numArr[j+1] {
let temp = numArr[j]
numArr[j] = numArr[j+1]
numArr[j+1] = temp
}
}
}
print(numArr)
//元素的插入
var arr5 = ["a","b","c","d"]
arr5.insert("f", at: 4)
print(arr5)
//字典 创建字典和创建数组是一样,创建同时就要制定key和value值的类型
let dict = [String:Int]()
let dict2 = ["name":"亚索","age":18,"height":1.8] as [String : Any]//Any说明value的值时任意值
//访问字典的元素
print("国服第一亚索"+(dict2["name"] as! String))
var dic3 = ["name":"蛮子","gender":"妖","skill":"蛮三刀"]
//找得到key值就是改,找不到key值就是添加
dic3["gender"] = "汉子"
dic3["hobby"] = "找妹子"
//字典的删除
dic3.removeValue(forKey: "gender")
print(dic3)
//字典的遍历
//遍历键值对
for value in dic3{
print(value)
}
//遍历字典key值
for key in dic3.keys{
print(key)
}
//遍历value值
for value in dic3.values{
print(value)
}
//枚举
/*enum 枚举名:值类型{
case 枚举情况 = 初始值
case 枚举情况 = 初始值
}*/
//值类型和初始值可以选择是否赋值
//枚举也是一种数据类型,只不过是我们自定义的数据类型
//季节
enum Season:String{
case spring = "春天"//0
case summer = "夏天"//1
case autumn = "秋天"//2
case winter = "冬天"//3
}
//定义变量常量
let aSeason = Season.spring
//给定数据类型时就可以省略枚举类型
let aSeason2:Season = .summer
//不给数据类型首次赋值一定要给枚举类型
var aSeason3 = Season.summer
aSeason3 = .spring//确定输出的值
//获取枚举情况的值
print(aSeason3.rawValue)//rawValue 才是真正的枚举值
print(aSeason3.hashValue)//hashValue case的编号
//枚举常和switch语句结合使用
switch aSeason3{
case .spring:
print("高鞠来了")
fallthrough//增加穿透性,但只能穿一次
case .summer:
print("吓死宝宝了")
case .autumn:
print("秋")
case .winter:
print("冻死宝宝了")
// 枚举情况都列举完,default语句就不要再写
// 枚举情况没有列举完,必须添加default语句
//default:
// print("我来自星星!!!")
}
//函数:能完成特定功能的代码段 好处:方便调用,保护知识产权,减少代码凹余
/*
func 函数名(参数) -> 返回值类型 {
函数体
}
*/
//无参无返回值
//小王给祥哥买红酒(祥哥没给钱,没有红酒给祥哥)
func buyRedWine() -> Void {
print("没钱没酒")
}
//函数调用
buyRedWine()
//无参有返回值
func buyRedWine2() -> Int {
print("82年的拉菲来一瓶")
return 1
}
let bottle = buyRedWine2()
print("买了\(bottle)瓶")
//有参无返回值
func buyXueBi(money:Int) {
print("\(money)块钱啊!好多啊!跑路了")
}
buyXueBi(money: 100)
//有参有返回值
func buyXueBi2(money:Int) -> Int {
print("买了\(money/2)瓶雪碧")
return money / 2
}
let bottle2 = buyXueBi2(money: 5)
print("买了\(bottle2)瓶雪碧")
//写一个函数计算两个数的和
//oneNumber,otherNumber是外部参数,对形参进行解释说明
func sum(oneNumber a:Int,otherNumber b:Int) -> Int {
return a + b
}
//调用时传的值是实参
//print(sum(a: 10, b: 20)) error
print(sum(oneNumber: 10, otherNumber: 20))
//可变参数函数
func qiuHe(numbers:Int...) -> Int {//参数是可变的,个数是不固定的
// 传的多个参数存放在numbers形参里了,此时numbers相当于一个数组
var reslut = 0
for item in numbers {
reslut += item
}
return reslut
}
print(qiuHe(numbers: 1,2,3,4,5,6,7))
//定义一个函数交换两个变量的值
//swift中所有的形参默认都是常量,函数内部不能修改函数的值
func swap(num1:inout Int , num2:inout Int) {
let temp = num1
num1 = num2
num2 = temp
}
var a = 10, b = 20
swap(&a, &b)
print("a=\(a)","b=\(b)")
//结构体 用来描述一个由多个属性组成的整体,也是一种自定数据类型
/*
struct 结构体名 {
属性列表
方法
}
*/
//类的三大特性:分装,继承,多态
struct Orgin {
//存储属性
var x:Float
var y:Float
// 对象方法
func drawOrign() {
print("在二维坐标系中画一个点")
}
// 类方法
static func showPoint(){
print("我是一个点")
}
}
//结构体的 使用
let p1 = Orgin(x: 10.2, y: 15.3)
p1.drawOrign()
//使用结构体名调用方法
Orgin.showPoint()
//创建一个Size的结构体
struct Size {
var width:Float
var height:Float
}
let aSize = Size(width: 100.0, height: 20.0)
print(aSize)
struct Frame {
// 结构体的属性依然可以是结构体
var orign:Orgin
var size:Size
//计算属性不适用给自己赋值,而是间接的给其他属性赋值,自己的值只能通过计算获得,不能直接给自己赋值
var center:Orgin{
set(newCenter){
orign.x = newCenter.x - size.width * 0.5
orign.y = newCenter.y - size.height * 0.5
}
get{
let x = orign.x + size.width * 0.5
let y = orign.y + size.height * 0.5
return Orgin(x: x, y: y)
}
}
}
var aFrame = Frame(orign: Orgin(x: 10, y: 20), size: Size(width: 100, height: 50))
//取计算属性的值
print(aFrame.center)
//给计算属性赋值,不是给他自己赋值,是间接的为其他属性赋值
aFrame.center = Orgin(x: 50, y: 50)
print(aFrame.orign)//orign:(0.0,25)
//类:具有相同特征和行为的事物的抽象
//根据类创建的实例就是:对象
//类的创建格式
/*
class 类名: 父类 {
属性
行为
}
*/
//人类:Person 属性:姓名 年龄 性别 行为:吃饭 睡觉
//NSObject 也是Swift中所有类的根类(基类)
class Person: NSObject {
//属性
//1直接给初始值
//Swift不允许非可选类型的属性不赋初始值
// var name:String = "小肥"
//2
//var name: String
//在初始化方法中,给属性赋值
// init(name:String) {
// self.name = name
// }
//3定义成可选类型
// var name:String?
//4 定义成隐式解析类型
public var name:String!
var age:Int!
fileprivate var gender:String!//文件属性:只能在本文件中使用
//类属性
static var color:String!
//提供一个快速创建对象的初始化方法
init(name:String,age:Int,gender:String) {
self.name = name
self.age = age
self.gender = gender
}
//行为(方法)
func eat() {
print("吃")
}
func sleep() {
print("睡")
}
//类方法
static func daDouDou(){
print("打豆豆")
}
}
//创建一个对象
let p = Person(name: "男哥", age: 16, gender: "女")
print(p.name,p.age,p.gender)
Person.color = "red"
print(Person.color)
//调用类方法
Person.daDouDou()
class Student: Person {
var number:Int!
func study() {
print("好好学习,过四级")
}
//重写从父类继承过来的方法
override func eat() {
super.eat()//保留父类方法的实现
print("吃满汉全席")
}
}
let stu = Student(name: "哲磊", age: 8, gender: "妖")
stu.number = 11
stu.study()
print(stu.name,stu.age,stu.gender)
stu.eat()
stu.sleep()
//协议 代理设计模式
//OC下的协议
@objc protocol GirlDelegate {//协议名
//协议中只写函数声明
//必须实现的方法
func makeMoney()
//选择实现的方法
@objc optional func wish()
@objc optional func cook()
@objc optional func doHousework()
}
class Girl: NSObject {
//设置代理属性
var delegate:GirlDelegate!
//女孩想买东西
func buySomething() {
//男朋友挣钱
self.delegate.makeMoney()
}
//女孩饿了
func hungry() {
//男朋友做饭
self.delegate.cook!()
}
//女孩有脏衣服
func youZangYiFu() {
//男朋友洗衣服
self.delegate.wish!()
}
//女孩家里脏了
func clearHome() {
//男孩做家务
self.delegate.doHousework!()
}
}
class Boy: NSObject,GirlDelegate {
internal func makeMoney() {
print("一天1000块")
}
func cook() {
print("法式甜品")
}
func wish() {
print("手洗")
}
func doHousework() {
print("找保洁")
}
}
let nanGe = Girl()
let LiYiFeng = Boy()
//给代理属性赋值
nanGe.delegate = LiYiFeng
//男哥发号指令
nanGe.buySomething()
nanGe.hungry()
nanGe.youZangYiFu()
nanGe.clearHome()
//代理设计模式的步骤
//1.设计协议
//2.设置代理属性
//3.遵循协议
//4.实现协议中的方法
//5.在外界制定代理属性(给代理属性赋值)
//6.告诉代理对象什么时候干活
//Swift中协议格式,协议中的方法都是必需实现的
protocol HostessDelegate {
func doHomework()
func cook()
func takeCarOf()
}
class Hostess: NSObject {
var delegate:HostessDelegate!
func clearHome() {
self.delegate.doHomework()
}
func hungry() {
self.delegate.cook()
}
func working() {
self.delegate.takeCarOf()
}
}
//给NSObject扩充方法
extension NSObject{
func sayHello() {
print("Hello")
}
}
class Nanny: NSObject {
}
let n = Nanny()
n.sayHello()
//延展:用来扩充一个类,主要用来管理类的方法或者是遵循某个协议的方法
extension Nanny : HostessDelegate{
func doHomework() {
print("做家务")
}
func cook() {
print("做饭")
}
func takeCarOf(){
print("照顾小孩")
}
}
let cuiHua = Hostess()
let chenYang = Nanny()//保姆对象
//5.给代理属性赋值
cuiHua.delegate = chenYang
cuiHua.clearHome()
cuiHua.hungry()
cuiHua.working()
//闭包:闭包的本质就是匿名函数(没有名字的函数),就是能完成特定功能的代码块//求和函数func sum(num1:Int,num2:Int) -> Int { return num1 + num2}/* (Int,Int)->(Int)*///定义闭包,let biBao:((Int,Int)->(Int))biBao = {//函数声明 (num1:Int,num2:Int)->(Int) inreturn num1 + num2}//调用闭包print(biBao(1,2))//无参数无返回值的闭包func sayHello() -> Void { print("Hello")}//()->(Void)let b1:(()->(Void)) = { ()->(Void) in print("无参数无返回值函数") return print("提前结束函数")// 提前结束一个函数(OC中一样) print("110")}b1()//无参数有返回值的闭包类型//() -> (Int)let b2:(()->(Int)) = { () -> (Int) in return 10}print(b2())//有参数有返回值var b3:((Int,Int)->Int) = { (n:Int,m:Int)->(Int) in return n + m}print(b3(1,5))b3 = { (a:Int,b:Int)->(Int) in return a - b}print(b3(10,5))//b3求两个数积的代码块b3 = { (x:Int,y:Int)->(Int) in return x * y}print(b3(3,12))//闭包类型不只能存储一个代码块,而是能存储和变量类型一致的所有代码块//有参数无返回值的闭包//比较两个数最大值,并把最大值输出的闭包//func maxOfTwo(num1:Int,num2:Int)->Void {// print(num1>num2 ? num1 : num2)//}//(Int,Int)->Voidlet b4:((Int,Int)->(Void)) = { (num1:Int,num2:Int)->(Void) in print(num1 > num2 ? num1 : num2)}b4(10,12)var arr = ["zhangsan","Lisi","YiFeng","mazi","xiaofan"]//可变的数组两种排序都可以使用,不可变只能使用sorted方法arr.sort()arr.sorted()arr.sort { (str1:String, str2:String) -> Bool in //比较大于,得出结果是降序 //比较小于,得出结果是升序 return str1 > str2}//< > 控制升序降序print(arr)//泛型func printContent(something:A) {
print(something)
}
printContent(something: "123123")