首页 > 代码库 > Swift学习笔记-1

Swift学习笔记-1

Apple官方开发手冊地址:

https://developer.apple.com/library/prerelease/ios/referencelibrary/GettingStarted/LandingPage/index.html


语法概览

1 Simple Values

常量定义:let

变量定义:var

常量或变量类型和初始值一致:
   var myVariable = 42
   myVariable = 50
   let myConstant = 42

也能够显式的指定类型: 
 let explicitDouble:Double = 70


类型转换,比方String()

   let label = "The width is "
   let width = 94
   let widthLabel = label + String(width)


打印常量/变量值使用 \()

    let apples = 3
    let oranges = 5
    let 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"

初始化一个空的数组或字典:

    let emptyArray = String[]()
    let emptyDictionary = Dictionary<String, Float>()


2 Control Flow

条件推断 if / switch

循环控制 for-in for  while  do-while

    let individualScores = [75, 43, 103, 87, 12]
    var teamScore = 0
    for score in individualScores {
    if score > 50 {
    teamScore += 3
    } else {
    teamScore += 1
    }
    }
    teamScore


switch case

    let vegetable = "red pepper"
    switch vegetable {
    case "celery":
    let vegetableComment = "Add some raisins and make ants on a log."
    case "cucumber", "watercress":
    let vegetableComment = "That would make a good tea sandwich."
    case let x where x.hasSuffix("pepper"):
    let vegetableComment = "Is it a spicy \(x)?

" default: let vegetableComment = "Everything tastes good in soup." }


for-in

    let interestingNumbers = [
    "Prime": [2, 3, 5, 7, 11, 13],
    "Fibonacci": [1, 1, 2, 3, 5, 8],
    "Square": [1, 4, 9, 16, 25],
    ]
    var largest = 0
    for (kind, numbers) in interestingNumbers {
    for number in numbers {
    if number > largest {
    largest = number
    }
    }
    }
    largest

while/do-while

var m = 2
do {
m = m * 2
} while m < 100
m

for 

传统格式:
var secondForLoop = 0
for var i = 0; i < 3; ++i {
secondForLoop += 1
}
secondForLoop

新的格式:
var firstForLoop = 0
for i in 0..3 {
firstForLoop += i
}
firstForLoop

3 Functions and Closures

    函数名(參数1,參数2)->返回类型
    func greet(name: String, day: String) -> String {
    return "Hello \(name), today is \(day)."
    }
    greet("Bob", "Tuesday")

返回多个參数:

    func getGasPrices() -> (Double, Double, Double) {
    return (3.59, 3.69, 3.79)
    }
    getGasPrices()

可变參数:

    func sumOf(numbers: Int...) -> Int {
    var sum = 0
    for number in numbers {
    sum += number
    }
    return sum
    }
    sumOf()
    sumOf(42, 597, 12)
函数嵌套:

    func returnFifteen() -> Int {
    var y = 10
    func 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)<pre name="code" class="objc">    class NamedShape {
    var numberOfSides: Int = 0
    var name: String
    init(name: String) {
    self.name = name
    }
    func simpleDescription() -> String {
    return "A shape with \(numberOfSides) sides."
    }
    }

用还有一个函数作參数:

    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, lessThanTen)

{}和$的使用

numbers.map({ number in 3 * number })

sort([1, 5, 3, 12, 2]) { $0 > $1 }

4 Objects and Classes

类实现.构造和析构函数 init/deinit

    class NamedShape {
    var numberOfSides: Int = 0
    var name: String
    init(name: String) {
       self.name = name
       }
    <code class="code-voice">deinit</code>(){}
 
    func simpleDescription() -> String {
          return "A shape with \(numberOfSides) sides."
       }
    }
类使用:

    var shape = Shape()
    shape.numberOfSides = 7
    var shapeDescription = shape.simpleDescription()

类的继承和函数重载:

<pre name="code" class="objc">class EquilateralTriangle: NamedShape {
   var sideLength: Double = 0.0
   子类中初始化须要运行:
   1)设置子类属性值
   2)父类初始化
   3)设置父类属性值
   init(sideLength: Double, name: String) {
     self.sideLength = sideLength
     super.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 triagle with sides of length \(sideLength)."
  }
}

预设置 willSet和 didSet
 willSet {
square.sideLength = newValue.sideLength
}

When working with optional values, you can write ? before operations like methods, properties, and subscripting. If the value before the? is nil, everything after the?

is ignored and the value of the whole expression isnil. Otherwise, the optional value is unwrapped, and everything after the?

acts on the unwrapped value. In both cases, the value of the whole expression is an optional value.

    let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square")
    let sideLength = optionalSquare?.sideLength

5 Enumerations and Structures

enum的定义和使用

    enum Rank: Int {
    case Ace = 1
    case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
    case Jack, Queen, King
    func simpleDescription() -> String {
    switch self {
    case .Ace:
    return "ace"
    case .Jack:
    return "jack"
    case .Queen:
    return "queen"
    case .King:
    return "king"
    default:
    return String(self.toRaw())
    }
    }
    }
    let ace = Rank.Ace
    let aceRawValue = http://www.mamicode.com/ace.toRaw()>enum值和raw值的转换(toRaw和fromRaw)

    if let convertedRank = Rank.fromRaw(3) {
    let threeDescription = convertedRank.simpleDescription()
    }

struct 和class的差别:

struct使用的时候是拷贝。class使用的时候是引用。


6 Protocols and Extensions

声明一个protocol

  protocol ExampleProtocol {
    var simpleDescription: String { get }
    mutating func adjust()
    }

协议使用:

   class SimpleClass: ExampleProtocol {
    var simpleDescription: String = "A very simple class."
    var anotherProperty: Int = 69105
    func adjust() {
    simpleDescription += " Now 100% adjusted."
    }
    }
    var a = SimpleClass()
    a.adjust()
    let aDescription = a.simpleDescription
    struct SimpleStructure: ExampleProtocol {
    var simpleDescription: String = "A simple structure"
    mutating func adjust() {
    simpleDescription += " (adjusted)"
    }
    }
    var b = SimpleStructure()
    b.adjust()
    let bDescription = b.simpleDescription

Notice the use of the mutating keyword in the declaration ofSimpleStructure to mark a method that modifies the structure.


Use extension to add functionality to an existing type

    extension Int: ExampleProtocol {
    var simpleDescription: String {
    return "The number \(self)"
    }
    mutating func adjust() {
    self += 42
    }
    }
   simpleDescription


7  Generics

參数类型待定:

    func repeat<ItemType>(item: ItemType, times: Int) -> ItemType[] {
    var result = ItemType[]()
    for i in 0..times {
    result += item
    }
    return result
    }
    repeat("knock", 4)
使用where带參数列表:

    func anyCommonElements <T, U where T: Sequence, U: Sequence, T.GeneratorType.Element: Equatable, T.GeneratorType.Element == U.GeneratorType.Element> (lhs: T, rhs: U) -> Bool {
    for lhsItem in lhs {
    for rhsItem in rhs {
    if lhsItem == rhsItem {
    return true
    }
    }
    }
    return false
    }
    anyCommonElements([1, 2, 3], [3])


Swift学习笔记-1