函数和闭包
1.使用func来声明一个函数,使用名字和参数来调用函数,使用->来指定函数返回值
func greet(name:String,day:String)->String{
return "Hello \(name),today is\(day)"
}
var name = greet("Bob","Tuesday")
println(name)
使用一个元组返回多个值
func getGasPrices()->(Double,Double,Double){
return (3.59,3.69,3.79)
}
println(getGasPrices())
函数的参数数量是可变的,用一个数组来获取它们
func sumOf(numbers:Int...)->Int{
var sum = 0
for numberin numbers{
sum += number;
}
return sum
}
println(sumOf())
println(sumOf(42,597,12))
函数可以嵌套。被嵌套的函数可以访问外侧函数的变量,你可以使用嵌套函数来重构一个太长或者太复杂的函数。
func returnFifteen()->Int{
var y = 10
func add(){
y += 5
}
add()
return y;
}
println(returnFifteen())
函数可以作为另一个函数的返回值。
func makeIncrementer()->(Int->Int){
func addOne(number:Int)->Int{
return 1+number
}
return addOne
}
var increment = makeIncrementer()
println(increment(7))
函数也可以当做参数传入另一个函数。
func lessThanTen(number:Int)->Bool{
return number<10
}
func hasAnyMatches(list:[Int ],condition:Int->Bool) ->Bool{
for item in list{
if condition(item){
return true;
}
}
return false;
}
函数实际上是一种特殊的闭包,你可以使用{}来创建一个匿名闭包。使用 in 来分割参数并返回类型。
var numbers = [20,19,7,12]
println(hasAnyMatches(numbers,lessThanTen))
println(numbers.map({
(number:Int) -> Int in
let result = 3 * number;
//println(result)
return result;
}))
对象和类
使用 class 和类名来创建一个类。类中属性的声明和常量、变量声明一样,唯一的区别就是它们的上下文是类。同样,方法和函数声明也一样。
要创建一个类的实例,在类名后面加上括号。使用点语法来访问实例的属性和方法
class Shape{
var numberOfSides = 0
func simpleDescription()->String{
return "A shape with \(numberOfSides) sides"
}
}
var shape = Shape()
shape.numberOfSides = 7
var shapeDescription = shape.simpleDescription();
println(shapeDescription)
使用 init 来创建一个构造器。
class NamedShape{
var numberOfSides:Int = 0
var name:String
init(name:String){
self.name = name;
}
func simpleDescription()->String{
return "A shape with \(numberOfSides) sides"
}
}
注意:self 被用来区别实例变量。当你创建实例的时候,像传入函数参数一样给类传入构造器的参数。每个属性都需要赋值——无论是通过声明(就像 numberOfSides)还是通过构造 |
器(就像 name)。 |
如果你需要在删除对象之前进行一些清理工作,使用 deinit 创建一个析构函数。 |
子类的定义方法是在它们的类名后面加上父类的名字,用冒号分割。创建类的时候并不需要一个标准的根类,所以你可以忽略父类。 |
子类如果要重写父类的方法的话,需要用 override 标记——如果没有添加 override 就重写父类方法的话编译器会报错。编译器同样会检测 override 标记的方法是否确实在父类中。 |