//閉包
//閉包的函數(shù)體部分由關(guān)鍵字 in 引入认然。 該關(guān)鍵字表示閉包的參數(shù)和返回值類型定義已經(jīng)完成,閉包函數(shù)體即將開始
var numbers = [1,2,3,4]
numbers.map({
number -> Int in
let result = 3*number
return result
})
//如果一個(gè)閉包的類型已知(map的類型為 Int->Int)可以省略參數(shù)類型和返回值
let mapNumbers = numbers.map({number in 3*number})
mapNumbers
//奇數(shù)返回0
numbers.map {
number -> Int in
var? count = 0
let? result = number%2
if result == 0{
count += 1
}
return count
}
//Swift 自動為內(nèi)聯(lián)函數(shù)提供了參數(shù)名稱簡寫功能漫萄,可以直接通過 $0,$1,$2等名字來引用的閉包的參數(shù)的值卷员。
//關(guān)于閉包的更加詳細(xì)的講解:http://c.biancheng.net/cpp/html/2285.html
let compareString = ["hfahkj","abc","qwer","bca","cab"]
compareString.sort()
/**
*? 對象和類
*/
//創(chuàng)建一個(gè)類,在類中聲明函數(shù)和屬性
class Shape{
var numberOfSides = 0
func description() -> String{
return "A shape with \(numberOfSides) sides"
}
}
//創(chuàng)建類的實(shí)例腾务,并使用點(diǎn)語法訪問屬性毕骡,調(diào)用方法
var shape = Shape()
shape.numberOfSides = 8
shape.description()
//使用自定義的init創(chuàng)建一個(gè)構(gòu)造器,如果需要在刪除對象前進(jìn)行清理工作岩瘦,使用deinit創(chuàng)建一個(gè)析構(gòu)函數(shù)
class NamedShape{
var numberOfSides = 0
var name = ""
init(name:String,sides:Int){
self.name = name
self.numberOfSides = sides
}
func description() -> String{
return "\(name) has \(numberOfSides) sides"
}
}
//初始化circle的時(shí)候可以不調(diào)用init方法未巫,系統(tǒng)會自動調(diào)用,當(dāng)然要加上也是可以的
var namedShape1 = NamedShape.init(name: "rectangle", sides: 4)
var namedShape = NamedShape(name: "rectangle", sides: 4)
namedShape.description()
//繼承語法,使用冒號分割:? subclass:parentclass启昧。需要重寫父類方法時(shí)叙凡,添加override標(biāo)記。
class Circle:NamedShape{
var radius:Double
init(radius:Double,name:String){
self.radius = radius
//訪問父類內(nèi)部變量和方法的時(shí)候需要先調(diào)用父類的init方法
super.init(name: name, sides: 0)
//調(diào)用super.init方法后可以對父類的屬性進(jìn)行修改
numberOfSides = 8
super.description()
}
//getter和setter方法
//swift中的getter/setter 有別于oc中的getter/setter. 在swift 中使用getter/setter 主要是用來間接獲取/改變其他屬性的值密末。在swift中這類屬性被稱之為“計(jì)算屬性”
var perimeter:Double{
set{//調(diào)用circle.permeter = 4會改變r(jià)adius的值握爷,newValue為賦值后的permeter值,此時(shí)相當(dāng)于radius = 4 + 1
radius = newValue+1
}
get{//circle.perimeter的結(jié)果為2严里,和oc的getter較相似
return radius*2
}
}
func area() -> Double{
return radius*radius*M_PI
}
//重寫父類方法
override func description() -> String {
return "\(name) has \(numberOfSides) sides,its area is \(area())"
}
}
var circle = Circle(radius: 1, name: "hahCircle")
circle.description()
//調(diào)用setter和getter方法新啼,間接改變r(jià)adius的值
circle.perimeter
circle.perimeter = 4
circle.radius