Swift基础加强_跟我打500行

今天上午、 继续练习了一下swift

然后 首先打开Xcode6

 

紧接着 我们创建一个playGround。  playGround不知道的孩子、 去百度给自己科普一下 

 

然后 我们看一下代码 、 跟着打 别赋值粘贴

  1 // Playground - noun: a place where people can play
  2 
  3 import UIKit
  4 
  5 // HelloWorld
  6 var str = "Hello, playground"
  7 
  8 // 常量可以改变值
  9 var myVariable = 42
 10 myVariable = 50
 11 let myConstant = 42
 12 
 13 // 指定数据类型
 14 let floatNumber:Float = 4
 15 
 16 // 使用强制转换
 17 let lable = "the lable is "
 18 let width = 94
 19 let labelwidth = lable + String(width)
 20 
 21 // 使用双引号中的\来转换
 22 let apples = 3
 23 let oranges = 5
 24 let appleSummary = "i have \(apples) apples"
 25 let orangeSummary = "i have \(oranges) oranges"
 26 
 27 // 自动识别数据类型加斜杠转换
 28 let somebody = "Alice"
 29 let age = 23.5
 30 let hellosomebody = "\(somebody) is \(age)"
 31 
 32 // 数组的初始化以及赋值
 33 var shoppingList = ["Alice", "Dylan"]
 34 shoppingList[1] = "Petit Alice"
 35 
 36 // 字典的初始化以及赋值
 37 var occupations = [
 38 
 39     "male" : "Alice",
 40     "female" : "Dylan"
 41 ]
 42 occupations["male"] = "Alice.Petit"
 43 
 44 // 初始化一个空的数组或者字典
 45 let emptyArray = [String]()
 46 let emptyDictionary = [String:Float]()
 47 
 48 // 初始化一个自动识别类型的字典或者数组
 49 let emptyArray_auto = []
 50 let emptyDictionary_auto = [:]
 51 
 52 // 控制流 不能省略大括号
 53 let individualScores = [75, 42, 103, 87, 12]
 54 var teamScore = 0
 55 for score in individualScores {
 56     if score > 50 {
 57         teamScore += 3
 58     } else {
 59         teamScore += 1
 60     }
 61 }
 62 teamScore
 63 
 64 // 写到这里 突然发现 变量名称直接打出去 就能打印了
 65 let emptyA = ["key": "value"]
 66 emptyA
 67 
 68 // 在if条件中 条件必须是bool表达式 输如一个直接score会出错的 看好了  是必须是表达式
 69 
 70 // 使用let来标记
 71 var optionalString: String? = "Hello"
 72 optionalString == nil
 73 
 74 var optionalName: String? = "John Appleseed"
 75 var getting = "Hello"
 76 optionalName = nil
 77 
 78 if let name = optionalName {
 79     getting = "hello, \(name)"
 80 } else {
 81     getting = "hello, Alice"
 82 }
 83 
 84 // switch
 85 let vegetable = "red pepper"
 86 switch vegetable {
 87     case "celery":
 88         let vegetableComment = "add some"
 89     case "cummber", "watercress":
 90         let vegetableComment = "this would make a good tea"
 91 case let x where x.hasSuffix("pepper"):
 92     let vegetableComment = "is it a spicy \(x)"
 93 default:
 94     let vegetableComment = "everything tastes good in soup"
 95 }
 96 
 97 // 碰到匹配的句子后 switch不会在继续往前走
 98 let interstingNumbers = [
 99     "prime" : [2, 3, 4, 6],
100     "Fibonacci" : [1, 1, 2, 3],
101     "Square" : [1, 4, 5]
102 ]
103 
104 var largest = 0
105 var maxtype = ""
106 for (kind, numbers) in interstingNumbers {
107     
108     for number in numbers {
109         if number > largest {
110             largest = number
111             maxtype = kind
112         }
113     }
114     
115 }
116 largest
117 maxtype
118 
119 // while
120 var n = 2
121 while n < 100 {
122     n = n*2
123 }
124 n
125 
126 var m  = 2
127 do {
128 m = m*2
129 } while m < 100
130 
131 m
132 
133 //  注意到了把  while do 不会多循环一次的  他们是等价的
134 
135 // ..<
136 var firstForLoop = 0
137 for i in 0..<4 {
138     firstForLoop += i
139 }
140 firstForLoop
141 
142 var secondForLoop = 0
143 for var i=0; i<4; i++ {
144     secondForLoop += i
145 }
146 secondForLoop
147 
148 var thirdForLoop = 0
149 for i in 0...4 {
150     thirdForLoop += i
151 }
152 thirdForLoop
153 
154 // func
155 func greet(name:String, day:String) ->String {
156     
157     return "Hello. \(name), today is \(day)"
158 }
159 greet("Alice", "Tuesday")
160 
161 func whateating(name:String) ->String {
162     return "\(name) eat what?"
163 }
164 whateating("Alice")
165 
166 // 使用元组让一个函数返回多个值
167 func calculateStatistics(scores:[Int]) ->(min: Int, max:Int, sum:Int) {
168     var min = scores[0]
169     var max = scores[0]
170     var sum = 0
171     
172     for score in scores {
173         
174         if score > max {
175             max = score
176         }
177         
178         if score < min {
179             min = score
180         }
181         
182         sum += score
183     }
184     
185     return (min, max, sum)
186 }
187 let staticArray = [1, 2, 3, 4, 5]
188 calculateStatistics(staticArray)
189 //  返回值可以用点语法单独的取到 也可以用位置
190 calculateStatistics(staticArray).sum
191 calculateStatistics(staticArray).0
192 
193 // 函数可以带有可变个数的参数
194 func sumOf(numbers: Int...) ->Int {
195     
196     var sum = 0
197     for number in numbers {
198         sum += number
199     }
200     return sum
201 }
202 sumOf(1, 2)
203 sumOf()
204 sumOf(1,2 ,3 ,4,5)
205 
206 // 计算参数平均值的联系
207 func acr(number:Int...) ->Float {
208     
209     var sum = 0
210     for num in number {
211         sum += num
212     }
213     return Float(sum)/Float(number.count)
214 }
215 acr(1, 2, 3)
216 acr(3, 4)
217 
218 // 函数可以嵌套 被嵌套的函数可以访问外侧函数的变量 可以嵌套函数来重构一个太长或者太复杂的函数
219 func returnFifteen() ->Int {
220     var y = 10
221     func add() {
222         y += 5
223     }
224     add()
225     return y
226 }
227 returnFifteen()
228 
229 // 函数可以作为另一个函数的返回值
230 func makeIncrementer() ->(Int->Int) {
231     
232     func addOne(number: Int) ->Int {
233         return 1 + number
234     }
235     return addOne
236 }
237 
238 var increment = makeIncrementer()
239 increment(7)
240 
241 // 函数可以当做参数 传入另一个函数
242 func hasAnymatches(list:[Int], condition:Int->Bool) ->Bool {
243     
244     for item in list {
245         if condition(item) {
246             return true
247         }
248     }
249     return false
250 }
251 
252 func lessThanTen(number: Int) ->Bool {
253     return number < 10
254 }
255 
256 var numbers = [20, 19, 2, 12]
257 hasAnymatches(numbers, lessThanTen)
258 
259 // 函数实际上是一特殊的闭包 使用{} 来创建一个匿名的闭包 使用int将参数和饭追只类型声明与闭包函数体进行分离
260 numbers.map({
261     (number: Int) -> Int in
262     let result = 3 * number
263     return result
264 })
265 
266 numbers.map({
267     (number: Int) -> Int in
268     if number % 2 != 0 {
269         return 0
270     }
271     return 1
272 })
273 
274 let mappedNumbers = numbers.map({
275     number in 3 * number
276 })
277 mappedNumbers
278 
279 let sortedNumbers = sorted(numbers) {
280     $0 > $1
281 }
282 sortedNumbers
283 
284 // 对象和类
285 class Shape {
286     var numberOdSides = 0
287     let testGetNumber = 0
288     
289     func setNumber(number: Int) {
290         numberOdSides = number
291     }
292     
293     func simpleDescription() ->String {
294         
295         return "A shape with \(numberOdSides) sides"
296     }
297 }
298 
299 var shape = Shape()
300 shape .setNumber(10)
301 shape .simpleDescription()
302 
303 // init
304 class NamedShape {
305     var numberOfSides: Int = 0
306     var name:String
307     
308     init(name: String, number:Int) {
309         self.name = name
310         self.numberOfSides = number
311     }
312     
313     func simepleDescription() ->String {
314         return "A \(name) with \(numberOfSides) sides"
315     }
316 }
317 var nameShape = NamedShape(name: "Alice", number: 20)
318 nameShape .simepleDescription()
319 
320 // 继承
321 class Square: NamedShape {
322     var sidelength: Double
323     
324     init(sidelength: Double, name:String, number: Int) {
325         
326         self.sidelength = sidelength
327         super.init(name: name, number: number)
328     }
329     
330     func area() ->Double {
331         
332         return sidelength * sidelength
333     }
334     
335     override func simepleDescription() -> String {
336         return "a Square with Sides of Length \(sidelength)"
337     }
338 }
339 
340 // getter setter
341 class EquilaterTrabgle: NamedShape {
342     
343     var sideLengths: Double = 0.0
344     
345     init(side: Double, name: String, number: Int) {
346         self.sideLengths = side
347         super.init(name: name, number: number)
348     }
349     
350     var perimeter: Double {
351         
352         get {
353             return 3 * sideLengths
354         }
355         
356         set {
357             sideLengths = newValue / 3.0
358         }
359     }
360     
361     override func simepleDescription() -> String {
362         return "an square triagle with \(sideLengths)"
363     }
364 }
365 
366 var triangle = EquilaterTrabgle(side: 3.1, name: "Alice", number: 3)
367 triangle.perimeter
368 triangle.perimeter = 9.9
369 triangle.sideLengths
370 triangle.simepleDescription()
371 
372 // 默认的情况相爱 方法的参数名和他们在方法内部的名字一样
373 class counter {
374     var count: Int = 0
375     func incrementBy(amount: Int, numberOfTimes times: Int) {
376         count += amount * times
377     }
378 }
379 var count = counter();
380 count.incrementBy(2, numberOfTimes: 7)
381 
382 // 处理变量的可选值的时候。 你可以在操作之前加?之前的值是nil的话那么后边的东西讲不会被执行 否则 ?后边的东西被运行 这种情况下 整个表达式只有一个可选值
383 let optionalSquare: Square = Square(sidelength: 2, name: "Alice", number: 3)
384 let sidelength = optionalSquare.sidelength
385 
386 // 枚举和结构体
387 enum Rank: Int {
388     
389     case Ace = 1
390     case Two, Three, Four, Five
391     case Jack, Queen
392     
393     func simpleDescription() ->String {
394         switch self {
395         case .Ace:
396             return "ace"
397         case .Jack:
398             return "jack"
399         case .Queen:
400             return "queen"
401         default:
402             return String(self.toRaw())
403         }
404     }
405 }
406 let ace = Rank.Ace
407 let aceRowValue = ace.toRaw()
408 ace.simpleDescription()
409 
410 // 写一个函数  来比较两个Rank值
411 enum Ranks: Int {
412     case one = 1
413     case two = 2
414     case three = 3
415     
416     func sub(number1: Int, number2: Int) ->Int {
417         
418         return number1 > number2 ? number1 : number2
419     }
420 }
421 let one = Ranks.one
422 one.sub(10, number2: 2)
423 
424 //  使用toRow 和fromRow函数在原始值和枚举值之前轻松的切换
425 if let convertedRank = Rank.fromRaw(3) {
426     let threeDescription = convertedRank.simpleDescription()
427     threeDescription
428 }
429 
430 // 枚举的成员是实际值并不是原始值的另一种表达方法 实际上 如果原始值没有意义 你不需要设置
431 enum Suit {
432     
433     case Spades, Hearts, Diamonds, Clubs
434     
435     func simleDescription() -> String {
436         switch self {
437         case .Spades:
438             return "spa"
439         case .hearts:
440             return "heart"
441         case .Diamonds:
442             return "dia"
443         case .Clubs:
444             return "clubs"
445         }
446     }
447 }
448 let hearts = Suit.Hearts
449 let heartsDescription = hearts.simleDescription()
450 
451 // 定义一个结构体 接受上边传来的东西
452 struct Card {
453     var rank: Rank
454     var suit: Suit
455     
456     func sipleDescription() ->String {
457         return "\(rank), \(suit)"
458     }
459 }
460 let thspeed = Card(rank: .Three, suit: .Spades)
461 let thspeeds = thspeed.sipleDescription()
462 thspeeds
463 thspeed
464 
465 // 通过枚举 区别正确或者错误信息
466 enum ServerResponse {
467     case Result(String, String)
468     case Error(String)
469 }
470 
471 let success = ServerResponse.Result("Alice", "Dylan")
472 let failure = ServerResponse.Error("Error")
473 
474 switch success {
475 case let .Result(sunrise, sunset):
476     let serverResponse = "\(sunrise), \(sunset)"
477 case let .Error(error):
478     let serverResponse = "Failure .. \(error)"
479 }
480 
481 // 协议和扩展
482 
483 // 首先  使用protocal来申明一个协议 
484 protocol ExamplepRrotocol {
485     var simpleDescription: String {
486         get
487     }
488     mutating func adjust()
489 }
490 
491 // 类 枚举 结构体都可以实现协议
492 class SimoleClass: ExamplepRrotocol  {
493     var simpleDescription: String = "A very petit girl"
494     var anotherpRroperty: Int = 69105
495     func adjust() {
496         simpleDescription += "Alice"
497     }
498 }
499 
500 var a = SimoleClass()
501 a.adjust()
502 
503 let aDescription = a.simpleDescription
504 
505 struct SimpleStructure : ExamplepRrotocol{
506     var simpleDescription: String = "Alice"
507     mutating func adjust() {
508         simpleDescription += ".Dylan"
509     }
510 }
511 
512 var b = SimpleStructure()
513 b.adjust()
514 let bDescription = b.simpleDescription
515 
516 // extension 为现有的类型添加功能
517 //extension Int: ExamplepRrotocol {
518 //    var simpleDescription: String {
519 //        return "the number \(self)"
520 //    }
521 //}

ok 大家又会有个提升。  加油喽

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。