//枚舉 函數 結構體 類 協議? 代理設計模式 閉包
import Foundation
//枚舉 enum
// enum 枚舉名:值類型 {
//? ? case 枚舉情況 = 初始值
//? ? case 枚舉情況 = 初始值
//? ? ...
// 值類型和初始值可以選擇是否賦值
//枚舉也是一種數據類型,只不過是我們自定義的數據類型
//}
//季節
enum Season:String {
case spring = "春天"
case summer = "夏天"
case autumn = "秋天"
case winter = "冬天"
}
//定義變量常量
let aSeason:Season = Season.spring
//給定數據類型就賦值時就可以省略枚舉類型
let aSeason2:Season = .summer
//不給定數據類型,首次賦值一定要給枚舉類型
var aSeason3 = Season.summer
aSeason3 = .spring
//獲取枚舉情況的值
print(aSeason3.rawValue)//rawValue才是真正的枚舉值
print(aSeason3.hashValue)//hashValue case的編號從0開始
//枚舉經常和switch結合使用
switch aSeason3{
case .spring:
print("春天來了,夏天還會遠嗎?")
fallthrough //增加case的穿透性 但是只能穿透一條
case .summer:
print("夏天來了,秋天還會遠嗎?")
fallthrough
case .autumn:
print("秋天來了,收獲的季節到了")
fallthrough
//枚舉情況沒有列舉完的default語句必須添加
// 枚舉情況都列舉完,default語句不需要再寫
case .winter:
print("冬天太冷了")
//default:
//? ? print("你是來自火星的嗎")
}
//函數:能完成特定功能的代碼段 好處:方便調用,保護知識產權 減少代碼冗余
////1無參數,無返回值
//2無參數,有返回值
//3有參數,無返回值
//4有參數,有返回值
// 函數定義的格式
/*
func 函數名(參數列表) -> (返回值類型) {
函數體
}
*/
//小王買紅酒(沒給錢 ,沒紅酒)
//1無參數,無返回值
//函數的定義
func buyRedwine() -> Void {
print("錢沒給不買")
}
//函數的調用
buyRedwine()
//2無參數,有返回值
func buyRedwine2() -> Int {
print("82年的拉菲來一瓶")
return 1
}
//函數的調用
let bottle = buyRedwine2()
print("買了\(bottle)瓶")
//3有參數,無返回值
//沒有返回值的時候 ->void可以省略
func buyXuebi(money:Int){
print("\(money)塊錢啊!好多呀!跑路呀")
}
buyXuebi(money: 100)
//4有參數,有返回值
func buyXuebei2(money:Int) -> Int {
print("買了\(money / 2)瓶雪碧")
return money / 2
}
let bottle2 = buyXuebei2(money: 5)
print("買了\(bottle2)瓶")
//計算兩個數的和
//a,b是形參 oneNumber,otherNumber是外部參數,對形參進行說明的
func sum(oneNumber a:Int, otherNumber b:Int) -> Int {
return a + b
}
//調用時傳的的值為實參
print(sum(oneNumber: 10, otherNumber: 20))
//可變參數函數
func qiuHe(numbers:Int...) -> Int {
//傳的多個參數存放在numbers形參里了,此時numbers相當一個數組
var result = 0
for item in numbers {
result += item
}
return result
}
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()
print(p1.x,p1.y)
//尺寸的結構體
struct Size {
var height:Float
var? width:Float
}
let asize = Size(height: 20.0, width: 100.0)
print(asize)
struct Frame {
//結構體的屬性依然可以是結構體
var orign:Orgin
var size:Size
//計算屬性不是用來給自己賦值的 而是要間接的為其他屬性賦值,自己的值只能通過計算獲得,不能直接給自己賦值
var center:Orgin {
// 間接為orign屬性賦值
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(height: 50, width: 100))
//取計算屬性的值
print(aFrame.center)
//給計算屬性賦值,不是給它自己賦值,是間接的為其他屬性賦值
aFrame.center = Orgin(x: 50, y: 50)
print(aFrame.orign) //orgin:(0.0,25.0)