@luckyJerry
2016-03-01T13:12:33.000000Z
字数 4911
阅读 416
iOS Swift
https://developer.apple.com/swift/resources/
let常亮, var变量
强制类型转换
let label = "The width is "let width = 94let widthLabel = label + String(width)
let apples = 3let oranges = 5let appleSummary = "I have \(apples) apples."let fruitSummary = "I have \(apples + oranges) pieces of fruit."
var shoppingList = ["catfish", "water", "tulips", "blue paint"]shoppingList[1] = "bottle of water"var occupations = ["Malcolm": "Captain","Kaylee": "Mechanic",]occupations["Jayne"] = "Public Relations"
创建空array和Dictionary
let emptyArray = [String]()let emptyDictionary = [String: Float]()
如果类型可以推测的话,可以写得更简单
shoppingList = []occupations = [:]
if and switch to make conditionals,
use for-in, for, while, and repeat-while to make loops
条件上()可选. Body上 {}必须
let vegetable = "red pepper"switch vegetable {case "celery":print("Add some raisins and make ants on a log.")case "cucumber", "watercress":print("That would make a good tea sandwich.")case let x where x.hasSuffix("pepper"):print("Is it a spicy \(x)?")default:print("Everything tastes good in soup.")}
let interestingNumbers = ["Prime": [2, 3, 5, 7, 11, 13],"Fibonacci": [1, 1, 2, 3, 5, 8],"Square": [1, 4, 9, 16, 25],]var largest = 0for (kind, numbers) in interestingNumbers {for number in numbers {if number > largest {largest = number}}}print(largest)
..< 标识循环范围,下面2个循环是一回事
var firstForLoop = 0for i in 0..<4 {firstForLoop += i}print(firstForLoop)var secondForLoop = 0for var i = 0; i < 4; ++i {secondForLoop += i}print(secondForLoop)
ps ..<4 不包括4 , ...4 包括4
var n = 2while n < 100 {n = n * 2}print(n)var m = 2repeat {m = m * 2} while m < 100print(m)
let nickName: String? = nillet fullName: String = "John Appleseed"let informalGreeting = "Hi \(nickName ?? fullName)"
func greet(name: String, day: String) -> String {return "Hello \(name), today is \(day)."}
func calculateStatistics(scores: [Int]) -> (min: Int, max: Int, sum: Int) {var min = scores[0]var max = scores[0]var sum = 0for score in scores {if score > max {max = score} else if score < min {min = score}sum += score}return (min, max, sum)}let statistics = calculateStatistics([5, 3, 100, 3, 9])print(statistics.sum)print(statistics.2)
func sumOf(numbers: Int...) -> Int {var sum = 0for number in numbers {sum += number}return sum}sumOf()sumOf(42, 597, 12)
func returnFifteen() -> Int {var y = 10func add() {y += 5}add()return y}returnFifteen()
func makeIncrementer() -> ((Int) -> Int) {func addOne(number: Int) -> Int {return 1 + number}return addOne}var increment = makeIncrementer()increment(7)
也可以把方法作为参数传递
func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool {for item in list {if condition(item) {return true}}return false}func lessThanTen(number: Int) -> Bool {return number < 10}var numbers = [20, 19, 7, 12]hasAnyMatches(numbers, condition: lessThanTen)
numbers.map({(number: Int) -> Int inlet result = 3 * numberreturn result})
如果一个closure的类型已知,例如是一个delegate的callback,那么可以省略参数和返回类型
let mappedNumbers = numbers.map({ number in 3 * number })print(mappedNumbers)
可以使用变量的编号而不是变量的名字来引用参数 $0
如果一个closure是某个方法唯一的参数的话,可以省略外面的()
let sortedNumbers = numbers.sort { $0 < $1 }print(sortedNumbers)
class Shape {var numberOfSides = 0func simpleDescription() -> String {return "A shape with \(numberOfSides) sides."}}
var shape = Shape()shape.numberOfSides = 7var shapeDescription = shape.simpleDescription()
class NamedShape {var numberOfSides: Int = 0var name: Stringinit(name: String) {self.name = name}func simpleDescription() -> String {return "A shape with \(numberOfSides) sides."}}
* deinit相当于NSObject 中的 dealloc方法。
class Square: NamedShape {var sideLength: Doubleinit(sideLength: Double, name: String) {self.sideLength = sideLengthsuper.init(name: name)numberOfSides = 4}func area() -> Double {return sideLength * sideLength}override func simpleDescription() -> String {return "A square with sides of length \(sideLength)."}}let test = Square(sideLength: 5.2, name: "my test square")test.area()test.simpleDescription()
class EquilateralTriangle: NamedShape {var sideLength: Double = 0.0init(sideLength: Double, name: String) {self.sideLength = sideLengthsuper.init(name: name)numberOfSides = 3}var perimeter: Double {get {return 3.0 * sideLength}set {sideLength = newValue / 3.0}}override func simpleDescription() -> String {return "An equilateral triangle with sides of length \(sideLength)."}}var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")print(triangle.perimeter)triangle.perimeter = 9.9print(triangle.sideLength)
willSet 和 didSet 会在设置一个property的newValue的时候运行
class TriangleAndSquare {var triangle: EquilateralTriangle {willSet {square.sideLength = newValue.sideLength}}var square: Square {willSet {triangle.sideLength = newValue.sideLength}}init(size: Double, name: String) {square = Square(sideLength: size, name: name)triangle = EquilateralTriangle(sideLength: size, name: name)}}
? 表示可能为空
let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square")let sideLength = optionalSquare?.sideLength