詳解Swift編程中的辦法與屬性的概念。本站提示廣大學習愛好者:(詳解Swift編程中的辦法與屬性的概念)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解Swift編程中的辦法與屬性的概念正文
辦法
在 Swift 中特定類型的相干聯功效被稱為辦法。在 Objective C 中類是用來界說辦法,個中作為 Swift 說話為用戶供給了靈巧性,類,構造和列舉中可以界說應用辦法。
實例辦法
在 Swift 說話,類,構造和列舉實例經由過程實例辦法拜訪。
實例辦法可以寫在花括號 {} 內。它隱含的拜訪辦法和類實例的屬性。當該類型指定詳細實例它挪用取得拜訪該特定實例。
語法
func funcname(Parameters)-> returntype
{Statement1Statement2---Statement N
return parameters
}
示例
class calculations {let a:Intlet b:Intlet res:Int
init(a:Int, b:Int){self.a = a
self.b = b
res = a + b
}
func tot(c:Int)->Int{return res - c
}
func result(){
println("Result is: \(tot(20))")
println("Result is: \(tot(50))")}}let pri = calculations(a:600, b:300)
pri.result()
當我們應用 playground 運轉下面的法式,獲得以下成果
Result is: 880 Result is: 850
Calculations 類界說了兩個實例辦法:
init() 被界說為兩個數 a 和 b 相加,並將其成果存儲在'res'
tot() 用於經由過程從 “res” 值減去 'c'
最初,挪用打印的盤算a和b的值辦法. 實例辦法以 "." 語法拜訪
部分和內部參數稱號
Swift 函數描寫下場部和全局變量聲明。異樣,Swift 辦法的定名規矩也相似 Objective C。然則部分和全局參數稱號聲明的特征關於函數和辦法分歧。 swift 第一個參數是由介詞稱號'with', 'for' 和 'by' 拜訪定名規矩。
Swift 供給聲明作為局數參數稱號,其它參數稱號為全局參數名,第一參數是辦法稱號。在這裡,“no1”辦法作為部分參數名來聲明。 'no2' 用於全局聲明,並經由過程該法式拜訪。
class division {var count:Int=0
func incrementBy(no1:Int, no2:Int){
count = no1 / no2
println(count)}}let counter = division()
counter.incrementBy(1800, no2:3)
counter.incrementBy(1600, no2:5)
counter.incrementBy(11000, no2:3)
當我們應用 playground 運轉下面的法式,獲得以下成果
600 320 3666
內部參數稱號應用 # 和 _ 符號
雖然 Swift 辦法供給第一個參數稱號作為部分聲明,用戶必需供給以修正參數稱號從部分到全局聲明。這可以經由過程'#'符號前綴應用第一參數名來完成。經由過程如許做,第一參數可以作為全局在全部模塊拜訪。
當用戶須要應用內部稱號拜訪在前面的參數名中,辦法的名字應用“_”符號籠罩。
class multiplication {var count:Int=0
func incrementBy(#no1:Int, no2:Int){
count = no1 * no2
println(count)}}let counter = multiplication()
counter.incrementBy(no1:800, no2:3)
counter.incrementBy(no1:100, no2:5)
counter.incrementBy(no1:15000, no2:3)
當我們應用 playground 運轉下面的法式,獲得以下成果
2400 500 45000
在辦法中的Self屬性
辦法有一個隱式屬性被稱為“self”,一切界說的類型實例所都有。“self”屬性被用於表現以後的實例界說的辦法。
class calculations {let a:Intlet b:Intlet res:Int
init(a:Int, b:Int){self.a = a
self.b = b
res = a + b
println("Inside Self Block: \(res)")}
func tot(c:Int)->Int{return res - c
}
func result(){
println("Result is: \(tot(20))")
println("Result is: \(tot(50))")}}let pri = calculations(a:600, b:300)let sum = calculations(a:1200, b:300)
pri.result()
sum.result()
當我們應用 playground 運轉下面的法式,獲得以下成果
Inside Self Block: 900 Inside Self Block: 1500 Result is: 880 Result is: 850 Result is: 1480 Result is: 1450
修正的實例辦法值類型
在 Swift 說話構造和列舉和值類型不克不及由它的實例辦法來轉變。但是,swift 說話經由過程“變異”行動供給了靈巧修正值類型。漸變將使得在實例辦法中的任何變更,將辦法履行以後變更前往到本來的情勢。另外,由 “selft” 屬性的新實例其隱式函數創立,履行以後將代替現有的辦法
struct area {var length =1var breadth =1
func area()->Int{return length * breadth
}
mutating func scaleBy(res:Int){
length *= res
breadth *= res
println(length)
println(breadth)}}var val = area(length:3, breadth:5)
val.scaleBy(3)
val.scaleBy(30)
val.scaleBy(300)
當我們應用 playground 運轉下面的法式,獲得以下成果
9 15 270 450 81000 135000
Self 屬性的分歧誘變辦法
漸變辦法聯合 “self” 屬性分派給新實例所界說的辦法。
struct area {var length =1var breadth =1
func area()->Int{return length * breadth
}
mutating func scaleBy(res:Int){self.length *= res
self.breadth *= res
println(length)
println(breadth)}}var val = area(length:3, breadth:5)
val.scaleBy(13)
當我們應用 playground 運轉下面的法式,獲得以下成果
39 65
類型辦法
當辦法的特定實例挪用,它挪用一個實例辦法而且當辦法挪用特定類型的辦法的一個被界說為 "類型辦法“。類型辦法 “類” 是由“func”症結字和構造界說,和列舉型辦法應用 “func” 症結字之前的“static”症結字界說。
類型辦法挪用,是經由過程拜訪 '.' 而不是挪用特定實例的辦法,例子和語法以下:
classMath{class func abs(number:Int)->Int{if number <0{return(-number)}else{return number
}}}struct absno
{static func abs(number:Int)->Int{if number <0{return(-number)}else{return number
}}}letno=Math.abs(-35)let num = absno.abs(-5)
println(no)
println(num)
當我們應用 playground 運轉下面的法式,獲得以下成果
35 5
屬性
Swift 說話供給了類,列舉或構造相干聯值的屬性。屬性可以被進一步分為存儲屬性和盤算屬性。
存儲機能和盤算屬性的差別
這兩種存儲和盤算屬性與實例類型相干聯。當屬性與它的類型值相干聯,那末它界說為“類型屬性”。存儲和盤算的屬性平日與一個特定類型的實例相干聯。但是,屬性也能夠與類型自己相干聯。如許的屬性是已知的類型的屬性。 屬性不雅察者也被應用
不雅察存儲的屬性值
不雅察子類從父繼續而得的屬性
存儲屬性
Swift 引見存儲的屬性概念用來存儲常量和變量的實例。常量存儲的屬性由 'let' 症結字界說和存儲變量的屬性由 “var” 症結字界說。
在界說存儲的屬性供給了“默許值”
在初始化時代用戶可以初始化和修正初始值
structNumber{var digits:Intlet pi =3.1415}var n =Number(digits:12345)
n.digits =67
println("\(n.digits)")
println("\(n.pi)")
當我們應用 playground 運轉下面的法式,獲得以下成果
67 3.1415
斟酌在下面的代碼,以下面的一行:
let pi = 3.1415
這裡,可變圓周率被初始化為存儲屬性值應用所述實例 pi = 3.1415. 所以,每當實例被稱為將持有零丁的值是:3.1415。
另外一種辦法,已存儲的屬性能夠常量構造。如許構造的全部實例將被以為是“常量屬性的存儲”。
structNumber{var digits:Intlet numbers =3.1415}var n =Number(digits:12345)
n.digits =67
println("\(n.digits)")
println("\(n.numbers)")
n.numbers =8.7
當我們應用 playground 運轉下面的法式,獲得以下成果
error: cannot assign to 'numbers' in 'n' n.numbers = 8.7
從新初始化'數字'為8.7,它將前往指導“數字''被聲明為常數的毛病新聞。
懶存儲屬性
Swift 供給了所謂的“懶存儲屬性',當變量被初次初始化它不管帳算初始值. “lazy” 潤飾符的變量聲明之前,把它作為一個懶存儲屬性。
延遲屬性被應用:
要延遲對象的創立。
當屬性是依附於一個類的其他部門,即:還沒有曉得
class sample {
lazy varno= number()// `var` declaration is required.}class number {var name ="Swift"}var firstsample = sample()
println(firstsample.no.name)
當我們應用 playground 運轉下面的法式,我們獲得以下成果
Swift
實例變量
在Objective C 中,存儲屬性還必需有實例變量用於備份目標,寄存在存儲的屬性聲明的值。
Swift 集成了這些概念成一個“存儲的屬性”聲明。而不用有一個響應的實例變量和備份值'存儲屬性“,包括經由過程變量名一個地位界說的有關變量屬性一切信息集成,數據類型和存儲器治理功效。
盤算屬性
而不是存儲盤算的屬性值供給了一個getter和一個可選的 setter 直接來檢索和設置其他屬性和值。
class sample {var no1 =0.0, no2 =0.0var length =300.0, breadth =150.0var middle:(Double,Double){get{return(length /2, breadth /2)}set(axis){
no1 = axis.0-(length /2)
no2 = axis.1-(breadth /2)}}}var result = sample()
println(result.middle)
result.middle =(0.0,10.0)
println(result.no1)
println(result.no2)
當我們應用 playground 運轉下面的法式,我們獲得以下成果
(150.0, 75.0) -150.0 -65.0
當盤算的屬性留下了新的值為不決義默許值將針對特定的變量來設置。
盤算屬性為只讀屬性
在盤算屬性只讀屬性被界說為 getter,但不是 setter。它老是用來前往一個值。變量經由過程應用 '.' 語法拜訪,但不克不及被設置為其他值。
class film {var head =""var duration =0.0var metaInfo:[String:String]{return["head":self.head,"duration":"\(self.duration)"]}}var movie = film()
movie.head ="Swift Properties"
movie.duration =3.09
println(movie.metaInfo["head"]!)
println(movie.metaInfo["duration"]!)
當我們應用 playground 運轉下面的法式,我們獲得以下成果
Swift Properties 3.09
盤算屬性屬性不雅察者
在Swift 中應用屬性不雅察者來不雅察和設置屬性值呼應。 當每次屬性值設置屬性不雅察者都被挪用。 除懶存儲屬性,我們可以經由過程添加屬性不雅察者“繼續”屬性“籠罩”辦法。
在寄存值之前 - willset
存儲新的值以後 - didset
當一個屬性被設置在初始化 willset 和 didset 不雅察者不克不及挪用。
classSamplepgm{var counter:Int=0{
willSet(newTotal){
println("Total Counter is: \(newTotal)")}
didSet{if counter > oldValue {
println("Newly Added Counter \(counter - oldValue)")}}}}letNewCounter=Samplepgm()NewCounter.counter =100NewCounter.counter =800
當我們應用 playground 運轉下面的法式,我們獲得以下成果
Total Counter is: 100 Newly Added Counter 100 Total Counter is: 800 Newly Added Counter 700
部分和全局變量
關於盤算和不雅察屬性部分和全局變量的聲明。
類型屬性
屬性界說類型界說部門有年夜括號{},而且變量的規模也被後面所界說。要界說值類型應用 “static” 症結字和類的類型應用 “class” 症結字。
語法
structStructname{staticvar storedTypeProperty =" "staticvar computedTypeProperty:Int{// return an Int value here}}enumEnumname{staticvar storedTypeProperty =" "staticvar computedTypeProperty:Int{// return an Int value here}}classClassname{classvar computedTypeProperty:Int{// return an Int value here}}
查詢和設置屬性
相似於實例屬性類型屬性查詢和設置,只是應用 “.” 語法,而不消指向該實例的類型。
structStudMarks{staticlet markCount =97staticvar totalCount =0varInternalMarks:Int=0{
didSet {ifInternalMarks>StudMarks.markCount {InternalMarks=StudMarks.markCount
}ifInternalMarks>StudMarks.totalCount {StudMarks.totalCount =InternalMarks}}}}var stud1Mark1 =StudMarks()var stud1Mark2 =StudMarks()
stud1Mark1.InternalMarks=98
println(stud1Mark1.InternalMarks)
stud1Mark2.InternalMarks=87
println(stud1Mark2.InternalMarks)
當我們應用 playground 運轉下面的法式,我們獲得以下成果
97 87