面向?qū)ο蟮暮诵氖穷?lèi)和對(duì)象,面向?qū)ο蟮娜筇卣鳎悍庋b个榕,繼承和多肽篡石。swift可以定義枚舉,結(jié)構(gòu)體和類(lèi)三種面向?qū)ο蟮膶?shí)例西采,支持定義存儲(chǔ)屬性凰萨,計(jì)算屬性,方法,下標(biāo)胖眷,構(gòu)造器和嵌套類(lèi)型
這次說(shuō)的是枚舉武通,結(jié)構(gòu)體和類(lèi)的相關(guān)知識(shí)
枚舉
//用于管理一組有限值的集合
/*
swift 定義枚舉的語(yǔ)法格式
enum 枚舉名 {
//使用case關(guān)鍵字列出所有的枚舉值
//枚舉的其它成員
}
*/
//定義枚舉
enum season {
case spring
case summer
case fall
case winter
}
//1.使用一個(gè)case來(lái)列舉所有的值
enum season2 {
case spring, summer, fall, winter
}
//2.使用枚舉來(lái)聲明變量
var weather: season
weather = season.spring//或者表示稱(chēng).spring
print(weather)
//枚舉和swift語(yǔ)句之間的聯(lián)系
var chooseday = season.fall
switch chooseday{
case .spring :
print("春天")
case .summer :
print("夏天")
case .fall :
print("秋天")
default :
print("在家")//若是列出了season所有的枚舉值,default可以省略
}
//為每一個(gè)枚舉值賦值珊搀,即為原始值
/*
原始值的語(yǔ)法格式:
enum 枚舉值 : 原始值類(lèi)型 {
case 枚舉值 = 原始值
}
在swift中不需要為每個(gè)枚舉值指定原始值冶忱,它可以根據(jù)已經(jīng)存在的原始值推斷出前后的枚舉值的原始
值。這是用于原始值是整形的情況境析,如果原始值是字符串囚枪,或者是字符,就需要完全指定原始值劳淆。
*/
enum weekday: Int {
case mon , tur , wen = 3,thur, fri , sat , sun
}
enum season3 : Character {
case spring = "春"
case summer = "夏"
case fall = "秋"
case winter = "冬"
}
//獲取枚舉中的原始值
print(weekday.fri.rawValue)//rawValue獲取原始值
//如何根據(jù)原始值獲取枚舉值
var myseason = season3(rawValue: "春")
if myseason != nil {
switch (myseason) {
// case .spring :
// print("春天")
// case .summer :
// print("夏天")
default :
print("")
}
}
//為枚舉成員定義關(guān)聯(lián)值
/*
swift不要求每一個(gè)成員擁有相同的關(guān)聯(lián)值
使用枚舉值的時(shí)候也要指定她的關(guān)聯(lián)值
*/
enum planet {
case earth(weight: Double , name: String)
case mars(density: Double , name: String, weight: CGFloat)
case venus(Double , String)
case saturn
case neptune
}
var p1 = planet.earth(weight: 1.0, name: "地球")
var p2 = planet.venus(0.815, "金星")
var p3 = planet.mars(density: 3.0, name: "火星", weight: 0.1)
//獲取關(guān)聯(lián)值
switch (p3) {
//將關(guān)聯(lián)值綁定到變量或者常量來(lái)提取
case planet.earth(var weight , var name):
print(weight, name)
//將關(guān)聯(lián)值都提取為常量或者變量链沼,直將一個(gè)var或者let放置枚舉成員之前
case let planet.mars(density: d, name : n, weight: w):
print(d,n,w)
default:
break
}
類(lèi)和結(jié)構(gòu)體
//類(lèi)和結(jié)構(gòu)體
/*
定義類(lèi)和結(jié)構(gòu)體,創(chuàng)建實(shí)例沛鸵,值類(lèi)型與引用類(lèi)型括勺。
類(lèi)和結(jié)構(gòu)體是很相似的,區(qū)別就是:結(jié)構(gòu)體不支持繼承谒臼,不支持定義構(gòu)造器朝刊。
*/
//類(lèi)
/*
[修飾符]class 類(lèi)名{
0到多個(gè)構(gòu)造器//初始化方法
0到多個(gè)屬性
0到多個(gè)方法
0到多個(gè)下標(biāo)
}
修飾符可以是 private public internal final
*/
/*
定義結(jié)構(gòu)體的語(yǔ)法
[修飾符]struct 結(jié)構(gòu)體名{
}
修飾符可以是 private public internal final
*/
/*
存儲(chǔ)屬性的語(yǔ)法
[修飾符]var 或者 let 存儲(chǔ)屬性名:類(lèi)型名字 = 初始值
*/
/*
定義構(gòu)造器的語(yǔ)法
[修飾符] init(形參列表){
0到多行可執(zhí)行語(yǔ)句組成的構(gòu)造器執(zhí)行體
}
*/
/*
定義方法的語(yǔ)法
[修飾符]func 方法名(形參列表)-> 返回值類(lèi)型 {
//0到多行可執(zhí)行語(yǔ)句
}
*/
//定義一個(gè)person類(lèi)
class person {
var name : String = "jack"
var age : Int = 0
func say (content: String){
print(content)
}
}
struct dog {
var name : String
var age : Int
func run(){
print("")
}
}
//創(chuàng)建person類(lèi)的實(shí)例,它是引用類(lèi)型
var p: person
p = person()//var p = person(),p只是一個(gè)引用變量蜈缤,并沒(méi)有包含響應(yīng)的屬性數(shù)據(jù)
print(p.name)
p.say(content: "hello swift")
//創(chuàng)建結(jié)構(gòu)體的實(shí)例,它是值類(lèi)型
var dog1 = dog(name: "玩彩", age: 12)
print(dog1.name)
//內(nèi)存中的對(duì)像可以有多個(gè)引用拾氓,即多個(gè)引用變量指向同一個(gè)對(duì)象
var p2 = p
p2.name = "rose"
print(p.name)
//值類(lèi)型,創(chuàng)建dog實(shí)例時(shí)底哥,這個(gè)變量就存儲(chǔ)了dog實(shí)例;
//若是把dog實(shí)例賦給另外一個(gè)變量咙鞍,系統(tǒng)會(huì)將dog實(shí)例進(jìn)行復(fù)制,不會(huì)影響原有的變量
var dog2 = dog1
dog2.name = "snoppy"
print(dog2.name)
print(dog1.name)
如何選擇類(lèi)和結(jié)構(gòu)體
/*
了解引用類(lèi)型的比較
self關(guān)鍵字的使用
類(lèi)和結(jié)構(gòu)體的選擇
*/
//引用類(lèi)型的比較
class user {
var name : String
var age : Int
init (name :String , age : Int){
self.name = name
self.age = age
}
}
var u1 = user(name : "han",age: 32)
var u2 = user(name : "han",age: 32)
//通過(guò)運(yùn)算符比較是否指向同一個(gè)類(lèi)型的實(shí)例趾徽,返回Bool變量
print(u1 === u2)
print(u1 !== u2)
var u3 = u1
print(u3 === u1)
//self關(guān)鍵詞
/*
1.構(gòu)造器中的self代表該構(gòu)造器正在初始化的實(shí)例
2.方法中的self代表該方法的調(diào)用者
*/
class dog {
func jump(){
print("正在執(zhí)行jump方法")
}
func run(){
self.jump()
print("正在執(zhí)行run")
}
}
class person {
var name : String = ""
var age : Int = 2
//顯示定義帶參數(shù)的構(gòu)造器
init(name: String, age : Int){
self.name = name
self.age = age
}
//定義一個(gè)info方法
func info (){
print("\(name),\(age)")
}
}
var person1 = person(name: "lily", age: 12)
person1.info()