注意:1.赋值器(setter)中,接收的值被自动命名为newValue。var perimeter: Double { get { return 3.0 * sideLength } set { sideLength = newValue / 3.0 } } 2如果不需要计算属性的值,但需要在赋值前后进行一些操作的话,使用willSet和didSet:
var triangle: EquilateralTriangle { willSet { square.sideLength = newValue.sideLength } } var square: Square { willSet { triangle.sideLength = newValue.sideLength } } 3?的另一种用途使用可空值时,?可以出现在方法、属性或下标前面。如果?前的值为nil,那么?后面的表达式会被忽略,而原表达式直接返回nil,例如:123456 1 2 3 let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square") let sideLength = optionalSquare?.sideLength4使用断言调试断言是一种实时检测条件是否为true的方法,也就是说,断言假定条件为true。断言保证了后续代码的执行依赖于条件的成立。如果条件满足,那么代码继续执行,如果这个条件为false,那么代码将会中断执行。在Xcode中,在调试的时候如果中断,可以通过查看调试语句来查看断言失败时的程序状态。断言也能提供适合的debug信息。 使用全局函数assert来使用断言调试,assert函数接受一个布尔表达式和一个断言失败时显示的消息,如:let age = -3assert(age >= 0, "A person's age cannot be less than zero")// this causes the assertion to trigger, because age is not >= 0当前一个条件返回false的时候,后面的错误日志将会输出。在这个例子中,只有当age >= 0的时候,条件被判定为true,但是age = -3,所以条件判定为false,输出错误日志 “A person’s age cannot be less than zero”。当然错误日志也可以省略,但是这样不利于调试,如assert(age >= 0)当需要检测一个条件可能是false,但是代码运行必须返回true的时候使用。下面给出了一些常用场景,可能会用到断言检测:传递一个整数类型下标的时候,比如作为数组的Index,这个值可能太小或者太大,从而造成数组越界;传递给函数的参数,但是一个无效的参数将不能在该函数中执行一个可选类型现在是nil,但是在接下来的代码中,需要是非nil的值才能够继续运行。详见 Subscripts和Functions注:断言会导致程序运行的中止,所以如果异常是预期可能发生的,那么断言是不合适的。这种情况下,异常是更合适的。断言保证错误在开发过程中会被发现,发布的应用里最好不要使用。5.前缀(prefix)相等和后缀(hasSuffix)相等使用string 类的两个方法hasPrefix和hasSuffix,来检查一个字符串的前缀或者后缀是否包含另外一个字符串,它需要一个String类型型的参数以及返回一个布尔类型的值。两个方法都会在原始字符串和前缀字符串或者后缀字符串之间做字符与字符之间的。6.大小写字符串你可以从一个String类型的uppercaseString 和 lowercaseString中获得一个字符串的大写或小写。 let normal = "Could you help me, please?" let shouty = normal.uppercaseString// shouty is equal to "COULD YOU HELP ME, PLEASE?" let whispered = normal.lowercaseString// whispered is equal to "could you help me, please?" 7.创建一个空的数组和确定的类型(不包含初始化值)使用的初始化语法:123 var someInts = Int[]()println("someInts is of type Int[] with \(someInts.count) items.")// prints "someInts is of type Int[] with 0 items.” 注意,someInt变量被确定为Int[],因为它使用生成Int[]的初始化方法。或者,如果上下文(context)已经提供类型信息,例如函数参数或者已经确定类型的常量和变量,你可以从空的数组实量(Array Literals)创建一个空数组,写作[](空的中括号对)。someInts.append(3)// someInts 现在包含1个Int型的元素someInts = []// someInts 现在是一个空的数组, 但是类型仍然为Int[]; 8创建一个空字典和字典一样,你可以使用确定类型的语法创建一个空的字典。 var namesOfIntegers = Dictionary()// namesOfIntegers 是一个空的 Dictionary 类型的字典 这个例子创建一个Int,String类型的字典来储存可读性较好的整数值。它的键是Int类型,以及它们的值是String类型。如果 上下文(context )中已经提供类型信息,可用一个字典实量(Dictionary Literal)创建一个空的字典,写作[;](由一对[]包含一个冒号:) namesOfIntegers[16] = "sixteen"// namesOfIntegers现在包含1 个键值对namesOfIntegers = [:]// namesOfIntegers 是一个类型为Int, String的空字典。 9 case中还可以直接测试元组是否符合相应的条件,_可以匹配任意值。下面的例子是判断(x,y)是否在矩形中,元组类型是(Int,Int) let somePoint = (1, 1) switch somePoint {case (0, 0):println("(0, 0) is at the origin") case (_, 0):println("(\(somePoint.0), 0) is on the x-axis") case (0, _):println("(0, \(somePoint.1)) is on the y-axis") case (-2...2, -2...2):println("(\(somePoint.0), \(somePoint.1)) is inside the box") default:println("(\(somePoint.0), \(somePoint.1)) is outside of the box")}// prints "(1, 1) is inside the box" fallthrough由于Swift中的switch语句不会自动的因为没有break而跳转到下一个case,因此如果需要想C语言中那样,依次执行每个case的时候,就需要用到fallthrough关键词。像下面这个例子一样,default分支最终都会被执行: let integerToDescribe = 5var description = "The number \(integerToDescribe) is"switch integerToDescribe {case 2, 3, 5, 7, 11, 13, 17, 19: description += " a prime number, and also" fallthrough default: description += " an integer."} println(description) // prints "The number 5 is a prime number, and also an integer."