diff options
| author | C. Bess <cbess@quantumquinn.com> | 2014-08-24 18:33:16 -0500 | 
|---|---|---|
| committer | C. Bess <cbess@quantumquinn.com> | 2014-08-24 18:33:16 -0500 | 
| commit | b50d4443cdca87e3342e2364c9e6afd2d7fce7d2 (patch) | |
| tree | e2edbd05d6ef6401593ec32d7322c01dd95b2866 | |
| parent | 2a5a4ebf64593009002053514deb057f37d7b693 (diff) | |
- add more examples; add book link
- add link to official Swift book from Apple
- add examples of access control and structures
- update protocols
| -rw-r--r-- | swift.html.markdown | 95 | 
1 files changed, 81 insertions, 14 deletions
| diff --git a/swift.html.markdown b/swift.html.markdown index 600eedcf..f8fa31fe 100644 --- a/swift.html.markdown +++ b/swift.html.markdown @@ -8,6 +8,8 @@ filename: learnswift.swift  Swift is a programming language for iOS and OS X development created by Apple. Designed to coexist with Objective-C and to be more resilient against erroneous code, Swift was introduced in 2014 at Apple's developer conference WWDC. It is built with the LLVM compiler included in Xcode 6 beta. +The official [Swift Programming Language](https://itunes.apple.com/us/book/swift-programming-language/id881256329) book from Apple is now available via iBooks. +  See also Apple's [getting started guide](https://developer.apple.com/library/prerelease/ios/referencelibrary/GettingStarted/LandingPage/index.html), which has a complete tutorial on Swift.  ```js @@ -23,7 +25,7 @@ See also Apple's [getting started guide](https://developer.apple.com/library/pre  println("Hello, world")  var myVariable = 42 -//let fƒ∆ = "value" // unicode in variable names +let øπΩ = "value" // unicode variable names  let myConstant = 3.1415926  let convenience = "keyword" // contextual variable name  let weak = "keyword"; let override = "another keyword" // statements can be separated by a semi-colon @@ -39,7 +41,7 @@ optionalString = nil  /*  Comment here      /* -        Nested comment here +        Nested comments are also supported      */  */ @@ -119,7 +121,7 @@ default: // required (in order to cover all possible input)  // Functions are a first-class type, meaning they can be nested  // in functions and can be passed around -// Function with Swift function docs +// Function with Swift header docs (format as reStructedText)  /**      A greet operation @@ -189,11 +191,33 @@ numbers = sorted(numbers, < )  print(numbers) // [3, 6, 18]  // +// MARK: Structures +// + +// Structures and classes have very similar capabilites +struct NamesTable { +    let names: [String] + +    // Custom subscript +    subscript(index: Int) -> String { +        return names[index] +    } +} + +// Structures have an auto-generated (implicit) designated initializer +let namesTable = NamesTable(names: ["Me", "Them"]) +//let name = namesTable[2] +//println("Name is \(name)") // Name is Them + +//  // MARK: Classes  // -class Shape { -    func getArea() -> Int { +// Classes, structures and its members have three levels of access control +// They are: internal (default), public, private + +public class Shape { +    public func getArea() -> Int {          return 0;      }  } @@ -203,23 +227,29 @@ class Shape {  // structured object, you should use a `struct`  // A simple class `Square` extends `Shape` -class Rect: Shape { +internal class Rect: Shape {      var sideLength: Int = 1      // Custom getter and setter property -    var perimeter: Int { +    private var perimeter: Int {          get {              return 4 * sideLength          }          set { +            // `newValue` is an implicit variable available to setters              sideLength = newValue / 4          }      } + +    // Lazily load a property +    // subShape remains nil (uninitialized) until getter called +    lazy var subShape = Rect(sideLength: 4)      // If you don't need a custom getter and setter,      // but still want to run code before and after getting or setting      // a property, you can use `willSet` and `didSet`      var identifier: String = "defaultID" { +        // the `willSet` arg will be the variable name for the new value          willSet(someIdentifier) {              print(someIdentifier)          } @@ -254,7 +284,7 @@ print(mySquare.sideLength) // 4  // compare instances, not the same as == which compares objects (equal to)  if mySquare === mySquare { -    println("Yep its mySquare") +    println("Yep, it's mySquare")  } @@ -279,15 +309,47 @@ enum Suit {  // -// MARK: Other +// MARK: Protocols  // -// `protocol`: Similar to Java interfaces. +// `protocol`s can require that conforming types have specific +// instance properties, instance methods, type methods,  +// operators, and subscripts. +  protocol ShapeGenerator { +    var enabled: Bool { get set }      func buildShape() -> Shape  } +/* +// Protocols declared with @objc allow optional functions, +// which allow you to check for conformance +@objc protocol TransformShape { +    optional func reshaped() +    optional func canReshape() -> Bool +} + +class MyShape: Rect { +    var delegate: TransformShape? + +    func grow() { +        sideLength += 2 + +        if let allow = self.delegate?.canReshape?() { +            // test for delegate then for method +            self.delegate?.reshaped?() +        } +    } +} +*/ + +// +// MARK: Other +// +  // `extension`s: Add extra functionality to an already existing type + +// Square now "conforms" to the `Printable` protocol  extension Square: Printable {      var description: String {          return "Area: \(self.getArea()) - ID: \(self.identifier)" @@ -321,7 +383,8 @@ func findIndex<T: Equatable>(array: [T], valueToFind: T) -> Int? {      }      return nil  } - +let foundAtIndex = findIndex([1, 2, 3, 4], 3) +println(foundAtIndex == 2) // true  // Operators:  // Custom operators can start with the characters: @@ -330,13 +393,17 @@ func findIndex<T: Equatable>(array: [T], valueToFind: T) -> Int? {  // Unicode math, symbol, arrow, dingbat, and line/box drawing characters.  prefix operator !!! {} -// An operator that triples the side length when used +// A prefix operator that triples the side length when used  prefix func !!! (inout shape: Square) -> Square {      shape.sideLength *= 3      return shape  } -let bigSquare = !!!mySquare -println(bigSquare.sideLength) +// current value +println(mySquare.sideLength) // 4 + +// change side length using custom !!! operator, increases size by 3 +!!!mySquare +println(mySquare.sideLength) // 12  ``` | 
