Swift 并不要求你為自定義類和結(jié)構(gòu)去創(chuàng)建獨(dú)立的接口和實(shí)現(xiàn)文件。你所要做的是在一個(gè)單一文件中定義一個(gè)類或者結(jié)構(gòu)體,系統(tǒng)將會(huì)自動(dòng)生成面向其它代碼的外部接口,通常一個(gè)類的實(shí)例被稱為對(duì)象。然而在 Swift 中,類和結(jié)構(gòu)體的關(guān)系要比在其他語(yǔ)言中更加的密切,本章中所討論的大部分功能都可以用在類和結(jié)構(gòu)體上。因此,我們會(huì)主要使用實(shí)例而不是對(duì)象。
類和結(jié)構(gòu)體對(duì)比
Swift 中類和結(jié)構(gòu)體有很多共同點(diǎn)。共同處在于:
1.定義屬性用于存儲(chǔ)值
2.定義方法用于提供功能
3.定義附屬腳本用于訪問(wèn)值
4.定義構(gòu)造器用于生成初始化值
5.通過(guò)擴(kuò)展以增加默認(rèn)實(shí)現(xiàn)的功能
6.實(shí)現(xiàn)協(xié)議以提供某種標(biāo)準(zhǔn)功能
7.與結(jié)構(gòu)體相比,類還有如下的附加功能:
8. 繼承允許一個(gè)類繼承另一個(gè)類的特征
9.類型轉(zhuǎn)換允許在運(yùn)行時(shí)檢查和解釋一個(gè)類實(shí)例的類型
10.析構(gòu)器允許一個(gè)類實(shí)例釋放任何其所被分配的資源
引用計(jì)數(shù)允許對(duì)一個(gè)類的多次引用,結(jié)構(gòu)體總是通過(guò)被復(fù)制的方式在代 碼中傳遞,不使用引用計(jì)數(shù)。
/*
定義類
class SomeClass {
// class definition goes here
}
定義結(jié)構(gòu)體
struct SomeStructure {
// structure definition goes here
}
*/
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//,Swift 并不要求你為自定義類和結(jié)構(gòu)去創(chuàng)建獨(dú)立的接口和實(shí)現(xiàn)文件。你所要做的是在一個(gè)單一文件中定義一個(gè)類或者結(jié)構(gòu)體,系統(tǒng)將會(huì)自動(dòng)生成面向其它代碼的外部接口,通常一個(gè)類的實(shí)例被稱為對(duì)象。然而在 Swift 中,類和結(jié)構(gòu)體的關(guān)系要比在其他語(yǔ)言中更加的密切,本章中所討論的大部分功能都可以用在類和結(jié)構(gòu)體上。因此,我們會(huì)主要使用實(shí)例而不是對(duì)象。
//類和結(jié)構(gòu)體對(duì)比
// Swift 中類和結(jié)構(gòu)體有很多共同點(diǎn)。共同處在于:
// 定義屬性用于存儲(chǔ)值
// 定義方法用于提供功能
// 定義附屬腳本用于訪問(wèn)值
// 定義構(gòu)造器用于生成初始化值
// 通過(guò)擴(kuò)展以增加默認(rèn)實(shí)現(xiàn)的功能
// 實(shí)現(xiàn)協(xié)議以提供某種標(biāo)準(zhǔn)功能
// 與結(jié)構(gòu)體相比,類還有如下的附加功能:
// 繼承允許一個(gè)類繼承另一個(gè)類的特征
// 類型轉(zhuǎn)換允許在運(yùn)行時(shí)檢查和解釋一個(gè)類實(shí)例的類型
// 析構(gòu)器允許一個(gè)類實(shí)例釋放任何其所被分配的資源
// 引用計(jì)數(shù)允許對(duì)一個(gè)類的多次引用,結(jié)構(gòu)體總是通過(guò)被復(fù)制的方式在代碼中傳遞,不使用引用計(jì)數(shù)。
/*
定義類
class SomeClass {
// class definition goes here
}
定義結(jié)構(gòu)體
struct SomeStructure {
// structure definition goes here
}
*/
//**************************結(jié)構(gòu)體***************************
//定義一個(gè)結(jié)構(gòu)體,在 Swift 中,所有的結(jié)構(gòu)體和枚舉類型都是值類型。這意味著它們的實(shí)例,以及實(shí)例中所包含的任何值類型屬性,在代碼中傳遞的時(shí)候都會(huì)被復(fù)制。
//swift的結(jié)構(gòu)體中可以 定義成員變量 和成員變量方法
//內(nèi)部有構(gòu)造函數(shù) 但是沒(méi)有析構(gòu)函數(shù)
//結(jié)構(gòu)體類型
//結(jié)構(gòu)體中的成員變量 必須要初始化
//1.在定義成員變量的時(shí)候初始化 2.或者在構(gòu)造函數(shù)中初始化
struct MYStudents{
//在定義的時(shí)候可以初始化成員變量
var age:Int = 0;
var height:Int = 0;
//內(nèi)部自動(dòng)會(huì)實(shí)現(xiàn)一個(gè)無(wú)參的構(gòu)造 和 帶參數(shù)的構(gòu)造
}
//創(chuàng)建一個(gè)結(jié)構(gòu)體變量
var xiaohong:MYStudents = MYStudents();//里面會(huì)自動(dòng)調(diào)用 內(nèi)部的init()無(wú)參的構(gòu)造
//獲取成員變量的值 通過(guò)'.'獲取
print("xiaohong_age = \(xiaohong.age) height = \(xiaohong.height)")//xiaohong_age = 0 height = 0
//直接用點(diǎn)操作
//對(duì)成員變量賦值
xiaohong.age = 24
xiaohong.height = 170
print("xiaohong_age = \(xiaohong.age) height = \(xiaohong.height)")//xiaohong_age = 24 height = 170
var xiaohuang:MYStudents = MYStudents(age: 25, height: 180) //會(huì)自動(dòng)調(diào)用內(nèi)部的帶參數(shù)的構(gòu)造
print("xiaohuang_age = \(xiaohuang.age) height = \(xiaohuang.height)")//xiaohuang_age = 25 height = 180
//下面我們自己實(shí)現(xiàn)構(gòu)造函數(shù)
struct MyStu {
var age:Int
var height:Int
//無(wú)參數(shù)的構(gòu)造函數(shù)構(gòu)造函數(shù)前不需要加func,一般也不要加要不然會(huì)報(bào)錯(cuò)系統(tǒng)
init() {
print("無(wú)參數(shù)的構(gòu)造函數(shù)");
// age = 18;
// height = 175;
//建議用self.xxx
self.age = 18;
self.height = 15;
}
//帶參數(shù)的構(gòu)造函數(shù)
//有參數(shù)的構(gòu)造函數(shù)調(diào)用的時(shí)候 會(huì)自動(dòng)加標(biāo)簽
init(age:Int,height:Int){
//因?yàn)閹?shù)的構(gòu)造 的參數(shù)名 經(jīng)常和成員變量同名 所以下面在賦值時(shí)建議使用self.age
//在結(jié)構(gòu)體內(nèi)部操作成員變量一般都是使用self.xxx
self.age = age;
self.height = height;
print("有參數(shù)的構(gòu)造函數(shù)被調(diào)用")
}
//一個(gè)結(jié)構(gòu)體中可以有多個(gè) 構(gòu)造函數(shù)
/*參數(shù)名也可以起其他的名字
init(newage:Int,newheight:Int){
//因?yàn)閹?shù)的構(gòu)造 的參數(shù)名 經(jīng)常和成員變量同名 所以下面在賦值時(shí)建議使用self.age
//在結(jié)構(gòu)體內(nèi)部操作成員變量一般都是使用self.xxx
self.age = newage;
self.height = newheight;
print("有參數(shù)的構(gòu)造函數(shù)被調(diào)用")
}
*/
//可以定義其它方法
func sleep(){
print("呼呼大睡")
}
mutating func jump(){
self.age = 10;//在其他函數(shù)中默認(rèn)是不能修改成員變量的值的,如果結(jié)構(gòu)體中的函數(shù)要修改成員變量 那么在定義的時(shí)候嵌套加mutating 關(guān)鍵字,現(xiàn)在swift版本不加這個(gè)關(guān)鍵字改變成員變量的值回報(bào)錯(cuò)的,所以這個(gè)問(wèn)題系統(tǒng)就會(huì)幫我們提示
}
}
var stu1:MyStu = MyStu()//自動(dòng)調(diào)用內(nèi)部的init()無(wú)參的構(gòu)造
print("stu1_age=\(stu1.age),stul_height = \(stu1.height)")// stu1_age=18,stul_height = 15
//有參數(shù)的構(gòu)造函數(shù)的調(diào)用
var stu2:MyStu = MyStu(age: 22, height: 175)//有參數(shù)的構(gòu)造函數(shù)被調(diào)用
//調(diào)用結(jié)構(gòu)體的方法
stu1.sleep();//呼呼大睡
stu2.jump()
print("stu2_age=\(stu2.age),stu2_height = \(stu2.height)")//stu2_age=10,stu2_height = 175
//**************************************************類**************************************************
//不需要繼承NSObject,類是引用類型
//類 和 結(jié)構(gòu)體的定義 很像 但是 類 有繼承 有析構(gòu)函數(shù)等等
//swift 中的 成員變量 可以沒(méi)有setter和getter 函數(shù) 就可以直接 通過(guò). 來(lái)方法
//swift 中的setter和getter 是用于計(jì)算屬性的 (計(jì)算屬性 不存儲(chǔ) 數(shù)據(jù) 用于計(jì)算數(shù)據(jù))
class Person{
//聲明變量
var age:Int = 0;//可以在這里初始化也可以在構(gòu)造函數(shù)里面
var score:Double;
var name:NSString?//可以用可選值
//類 有無(wú)參數(shù)的構(gòu)造函數(shù)和有參數(shù)的構(gòu)造函數(shù)
//一個(gè)類可以有多個(gè)構(gòu)造函數(shù)
init(){
//建議內(nèi)部訪問(wèn)成員變量用self.xxx
self.age = 22;
self.score = 100;
self.name = "pengpeng";
print("無(wú)參數(shù)的構(gòu)造函數(shù)被調(diào)用")
}
//有參數(shù)的構(gòu)造
init(age:Int,score:Double,name:String){
self.age = age;
self.score = score;
self.name = name;
print("有參數(shù)的構(gòu)造函數(shù)被調(diào)用");
}
//獲取成員變量的值 實(shí)際上這樣的函數(shù) 可以不用寫(xiě)
//swift中 對(duì)象可以通過(guò)點(diǎn)來(lái)操作 成員變量
//這是 和OC 不同的地方
func getAge() ->Int{
return self.age;
}
//成員方法
func writeCode(){
print("正在快樂(lè)的敲代碼")
}
//修改成員變量
//普通方法也可以叫實(shí)例方法
func changeScoreToZero(){
//類中的普通方法可以 直接修改成員變量 和結(jié)構(gòu)體不一樣 結(jié)構(gòu)體需要加 mutating
self.score = 0.0;
print("score = \(self.score)");
}
//swift 中的類方法 /和OC的類方法 類似/和c++的靜態(tài)方法類似
//類方法前 加 class
//類方法是由類調(diào)用的方法 是和對(duì)象無(wú)關(guān)的方法
class func hh() {
print("這是類方法")
}
//swift 還有析構(gòu)函數(shù)
//對(duì)象銷毀的時(shí)候自動(dòng)調(diào)用函數(shù)就是析構(gòu)函數(shù)
deinit{
print("對(duì)象銷毀調(diào)用析構(gòu)")
}
}
//設(shè)計(jì)類的時(shí)候 成員變量也必須要初始化
//全局變量
var pengpeng:Person = Person();//自動(dòng)調(diào)用無(wú)參數(shù)的構(gòu)造
func test(){
//類名調(diào)用類方法
Person .hh()
//局部變量
//peng變量引用一個(gè)Person對(duì)象
////Person()會(huì)創(chuàng)建對(duì)象 語(yǔ)句的含義 表示把一個(gè)Person類的對(duì)象一個(gè)引用 給xpeng
//peng 和 OC中的對(duì)象指針類似
var peng:Person = Person()
//newPeng和peng引用的是同一個(gè)對(duì)象
var newPeng:Person = peng;
//獲取成員變量的值 可以直接用 .操作
//不需要寫(xiě) OC中的setter和getter方法
print("age:\(peng.age) name:\(peng.name!) score = \(peng.score)")
//修改值
peng.age = 24
peng.name = "peng"
peng.score = 100.0
print("age:\(peng.age) name:\(peng.name!) score = \(peng.score)")
peng.writeCode()
//創(chuàng)建對(duì)象 用有參數(shù)的構(gòu)造
var xiaofen:Person = Person(age: 20, score: 99, name: "xiaofen")
print("xiaofen_age:\(xiaofen.age) name:\(xiaofen.name!) score = \(xiaofen.score)")
}
test()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
最后編輯于 :2017.12.03 14:08:05
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者 【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。 平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。