Swift初探

seqn0777 8年前

来自: http://my.oschina.net/xinxingegeya/blog/608514


Swift初探

Xcode 7.2

下面swift一些基本的语法。把这些代码写下来,发现swift和一些语言很像,比如javascript和scala。如果对这些语言比较熟悉的话,一看代码就会懂。

总的来说swift的语法还是比较fashion。好评~~~

//: Playground - noun: a place where people can play    import UIKit    var str = "Hello, playground"    let name = "hello world"    //编译器会自动推断类型,该类型是Int  let implicitInt = 70    //编译器会自动推断类型,该类型是double  let implicitDouble = 10.0    //定义一个常量,并指定类型为double  let explicitDouble: Double = 70    let height:Float = 5      let label = "the width is"    let width = 90    //值永远不会被隐式转换为其他类型,这里使用String 显式转换一个字符串  let widthLable = label + String(width)    print(widthLable)    let apples = 3    let oranges = 5      //  \(apples)是一种简单的方式来转换字符串  let appliSummary = "I have \(apples) apples;"    let fruitSummary = "I have \(apples + oranges) pieces of fruits;"      //创建一个数组  let shoplist = ["catfish","water","tulips","blue paint"];    //使用[String]表明是一种数组类型  var shoppingList: [String] = ["Eggs", "Milk"]    //使用下标来访问数组元素  print(shoplist[1])    //创建一个空数组  let emptyArray = [];  print(emptyArray)    //创建一个空的数组  let emptyStringArray = [String]()  print(emptyStringArray)      let individualScores = [12,12,13,25]    var teamScore = 0    //swift中基本的for循环控制流  for score in individualScores {      if score > 13{          teamScore += 3      } else{          teamScore += 1      }  }    print(teamScore)      //使用?表示该变量的值是可选的  var optionalString:String? = "hello"  optionalString = nil  var optionalName:String? = nil    var greeting = "Hello!"      //如果变量的可选值是 nil,条件会判断为 false,大括号中的代码会被跳过。如果不是nil,  //会将值赋给 let 后面的常量,这样代码块中就可以使用这个值了。  if let name = optionalName {      greeting = "Hello,\(name)"  } else {      greeting = "Hello everyone"  }        //switch语法  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."  }    let vegetable2 = "watercress"      //switch必须有一个default  switch vegetable2{  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."  }      //定义字典数组  let interestingNumbers = [      "prime":[2,3,5,7],      "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          }      }  }    print(largest)      //1...3 是 Closed Range Operator => 1 2 3  var sum = 0  for i in 1...3{      sum += i  }  print(sum)    sum = 0    //1..<3 是 Half-Open Range Operator => 1 2  for i in 1..<3 {      sum += i  }  print(sum)        //函数的定义  //使用右向箭头表示返回值  func greet(name:String, day:String) ->String{      return "Hello \(name),today is \(day)";  }    greet("LiYi", day: "2016-1-1")  greet("world",day: "2016-1-1")      //函数返回类型为元组  func getGasPrices() -> (Double,Double,Double){      return (3.56,3.23,3.21)  }    getGasPrices()      //swift的可变参数列表  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()        //=========函数作为返回值    //定义一个函数,返回值是一个函数类型  //函数类型是 (Int -> Int) ,表示该函数接收一个入参Int,返回值是Int  func makeIncrementer() -> (Int -> Int){      func addOne(number:Int)->Int{          return 1 + number      }      return addOne  }    var increment = makeIncrementer()    increment(1)      //定义一个函数 makeAdd ,其返回值也是一个函数类型,  //(Int,Int) -> Int 表示返回类型,是一个接收两个Int参数,返回Int的函数  func makeAdd()-> (Int,Int) -> Int {        func add(a:Int ,b:Int) -> Int{          return a + b      }            return add;  }    var  add = makeAdd()    add(1,2)      //=========函数作为参数  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  }      hasAnyMatches([20,19,7,12], condition: lessThanTen)      var numbers = [20,19,7,12]    //(number:Int) -> Int 是一个匿名闭包的入参和返回值  //使numbers数组中的元素都变成了三倍  numbers.map(      {          (number:Int) -> Int in          let result = 3 * number          return result      }  )      //map 函数  numbers.map(      {          (number:Int) -> Int in          if number % 2==0{              let result = 3 * number              return result          } else {              return 0          }      }  )    //filter 函数  numbers.filter({      (number:Int) -> Bool in      return number % 2 == 0  })        //类的定义  class Shape{      //定义一个常量      let happy = true      //定义一个变量      var numberOfSides = 0      func simpleDscription() -> String{          return "A shape with \(numberOfSides) sides"      }            func toHappy()->Bool{          return happy      }  }        //创建类的实例  var shape = Shape()    shape.numberOfSides = 10    shape.simpleDscription()    shape.toHappy()      //定义类的构造函数  class NamedShape{            var numberOfSides:Int = 0            var name: String            //定义类的构造函数      init(name:String){          self.name = name      }            func simpleDescription() -> String {          return "A shape with \(numberOfSides) sides"      }  }    var namedShape = NamedShape(name: "hello world")    namedShape.name  namedShape.simpleDescription()      //继承 类的继承  class Square : NamedShape{      var sideLength : Double      init(sideLength: Double ,name :String){          self.sideLength = sideLength          super.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.12, name: "my test square")  test.area()  test.simpleDescription()        class EquilateralTriangle : NamedShape{        var sideLength : Double = 0.0            init(sideLength: Double, name: String){            self.sideLength = sideLength          super.init(name: name)          numberOfSides = 3      }                  //定义属性的setter 和 getter 方法      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)"      }  }    var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")    triangle.perimeter  triangle.perimeter = 9.9  triangle.sideLength        //定义一个类,类中有一个函数  class Counter {      var count: Int = 0            //该方法的第二个参数有两个参数名      //第一个参数名是numberOfTimes,给方法的外部调用者使用      //第二个参数名是times,给方法内部使用      func incrementBy(amount:Int,numberOfTimes times: Int){          count += amount * times      }  }      //创建一个实例  var counter = Counter()  counter.incrementBy(2, numberOfTimes: 7)        //定义一个枚举  //枚举原始值的类型是Int,所以你只需要设置第一个原始值。  //剩下的原始值会按照顺序赋值。你也可以使用字符串或者浮点数作为枚举的原始值。  enum Rank: Int {            //指定该枚举实例的原始值为1      case Ace = 1      case Two ,Three ,Four , Five , Six ,Seven , Eight ,Nine ,Ten      case Jack,Queen,King            func simpelDescription() -> String{                switch self{          case .Ace:              return "ace"          case .Jack:              return "jack"          case .Queen:              return "queue"          case .King:              return "king"          default:              return String(self.rawValue)          }      }  }      let ace = Rank.Ace    //调用 rawValue 方法  let aceRawValue = ace.rawValue  ace.simpelDescription()        //定义不需要原始值的枚举  enum Suit {      case Spades,Hearts,Diamonds,Clubs            func simepleDescription ()-> String {                switch self {          case .Spades:              return "spades"          case .Hearts:              return "hearts"          case .Diamonds:              return "diamonds"          case .Clubs:              return "clubs"          }      }  }      let hearts = Suit.Hearts  let heartsHashValue = hearts.hashValue  let heartDescription = hearts.simepleDescription()      //创建一个结构体  struct Card {      var rank : Rank      var suit : Suit            func simpleDescription() -> String {          return "The \(rank.simpelDescription()) of \(suit.simepleDescription())"            }  }    //使用 struct 来创建一个结构体。  //结构体和类有很多相同的地方,比如方法和构造器。  //它们结构体之间最大的一个区别就是,结构体是传值,类是传引用。  let threeOfSpades = Card(rank: .Three, suit: .Spades)  let threeOfSpadesDescription = threeOfSpades.simpleDescription()        //该枚举也不需要原始值    //一个枚举成员的实例可以有实例值。  //相同枚举成员的实例可以有不同的值。  //创建实例的时候传入值即可。  //实例值和原始值是不同的:枚举成员的原始值对于所有实例都是相同的  //而且你是在定义枚举的时候设置原始值。  enum ServerResponse {      case Result(String,String)      case Error(String)  }      //创建一个枚举值的实例  let success = ServerResponse.Result("6:00 am", "8:09 pm")  //创建一个枚举值的实例  let failure = ServerResponse.Error("out of cheese")      //success是一个枚举实例  switch success {  case let .Result(sunrise, sunset):      let serverResponse = "sunrise is at \(sunrise) and sunset is at \(sunset)"  case let .Error(error):      let serverResponse = "Failure...\(error)"  }        //============接口和扩展  //使用protocol来声明一个接口  protocol ExampleProtocol{      var simpleDescription : String { get }            mutating func adjust()  }    //类、枚举和结构体都可以实现接口  class SimpleClass: ExampleProtocol{      var simpleDescription :String = "a very simple class"      var anotherProperty : Int = 123            func adjust() {          simpleDescription += " now 100% adjusted"      }  }    var a = SimpleClass()  a.adjust()  let desc = a.simpleDescription        //该结构体实现协议  struct SimpleStructure: ExampleProtocol {      var simpleDescription: String = "a very simple structure"      //mutating 关键字用来标记一个会修改结构体的方法      mutating func adjust(){          simpleDescription += " (adjusted)"      }  }      // 枚举继承协议  enum SimpleEnum: ExampleProtocol{      case First(String)      case Second(String)            //属性的get方法      var simpleDescription:String{          get{              switch self{              case let .First(text):                  return text              default:                  return "hi"              }          }                }            mutating func adjust(){          print("description: hi")      }  }    var s = SimpleEnum.First("dingding")  s.simpleDescription  s.adjust()          //使用 extension 来为现有的类型添加功能,比如添加一个计算属性的方法。  //你可以使用扩展来给任意类型添加协议  //甚至是你从外部库或者框架中导入的类型  extension Int : ExampleProtocol{      var simpleDescription : String {          return "the number \(self)"      }        mutating func adjust() {          self += 42      }  }    7.simpleDescription        // 定义一个泛型函数  func repeatItem<T>(item : T,times: Int) -> [T] {        //定义一个空的数组      var result = [T]()            for i in 0...times {          //数组元素的追加          result.append(item)      }            return result  }    repeatItem(3, times: 4)

============END============