//闭包
//闭包的函数体部分由关键字 in 引入。 该关键字表示闭包的参数和返回值类型定义已经完成,闭包函数体即将开始
var numbers = [1,2,3,4]
numbers.map({
number -> Int in
let result = 3*number
return result
})
//如果一个闭包的类型已知(map的类型为 Int->Int)可以省略参数类型和返回值
let mapNumbers = numbers.map({number in 3*number})
mapNumbers
//奇数返回0
numbers.map {
number -> Int in
var count = 0
let result = number%2
if result == 0{
count += 1
}
return count
}
//Swift 自动为内联函数提供了参数名称简写功能,可以直接通过 $0,$1,$2等名字来引用的闭包的参数的值。
//关于闭包的更加详细的讲解:http://c.biancheng.net/cpp/html/2285.html
let compareString = ["hfahkj","abc","qwer","bca","cab"]
compareString.sort()
/**
* 对象和类
*/
//创建一个类,在类中声明函数和属性
class Shape{
var numberOfSides = 0
func description() -> String{
return "A shape with \(numberOfSides) sides"
}
}
//创建类的实例,并使用点语法访问属性,调用方法
var shape = Shape()
shape.numberOfSides = 8
shape.description()
//使用自定义的init创建一个构造器,如果需要在删除对象前进行清理工作,使用deinit创建一个析构函数
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的时候可以不调用init方法,系统会自动调用,当然要加上也是可以的
var namedShape1 = NamedShape.init(name: "rectangle", sides: 4)
var namedShape = NamedShape(name: "rectangle", sides: 4)
namedShape.description()
//继承语法,使用冒号分割: subclass:parentclass。需要重写父类方法时,添加override标记。
class Circle:NamedShape{
var radius:Double
init(radius:Double,name:String){
self.radius = radius
//访问父类内部变量和方法的时候需要先调用父类的init方法
super.init(name: name, sides: 0)
//调用super.init方法后可以对父类的属性进行修改
numberOfSides = 8
super.description()
}
//getter和setter方法
//swift中的getter/setter 有别于oc中的getter/setter. 在swift 中使用getter/setter 主要是用来间接获取/改变其他属性的值。在swift中这类属性被称之为“计算属性”
var perimeter:Double{
set{//调用circle.permeter = 4会改变radius的值,newValue为赋值后的permeter值,此时相当于radius = 4 + 1
radius = newValue+1
}
get{//circle.perimeter的结果为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()
//调用setter和getter方法,间接改变radius的值
circle.perimeter
circle.perimeter = 4
circle.radius