Swift-基础巩固

1.简单值

  • 常量或者变量的类型必须和你赋给它们的值一样,然而,你不用明确地声明类型,声明的同时赋值的话,编译器会自动推断类型。
    let number: Float = 4
    print("输出数字:", number)
    

    输出数字: 4.0

值永远不会被隐式转换为其他类型,如果你需要把一个值转换成其他类型,请显示转换

  • 数字转换字符串操作(方法一)
let label = "the width is"
let width = 94
let widthLabel = label + String(width)//数字转换字符串操作
print(widthLabel)

打印结果:the width is94

  • 数字转字符串操作(方法二)把值写到括号中,并且在括号之前写一个反斜杠
let apples = 3
let oranges = 5
let appleSummary = "I have \(apples) apples."
let fruitSummary = "I have \(apples + oranges) pices of fruit"
print(appleSummary)
print(fruitSummary)

输出结果:I have 3 apples.
输出结果:I have 8 pices of fruit

  • 数组的创建和字典的使用
    使用方括号 [] 来创建数组和字典,并使用下标或者键(key)来访问元素,最后一个元素前允许有个逗号
var shoppingList = ["catfish","water","tulips","blue paint"]
shoppingList[1] = "bottle of water"
print("shoppingList:",shoppingList)
//shoppingList: ["catfish", "bottle of water", "tulips", "blue paint"]

var occupations = [
           "Malcolm":"Captain",
           "Kaylee":"Mechanic",
       ]
occupations["Jayne"] = "public relations"
print(occupations)//["Kaylee": "Mechanic", "Malcolm": "Captain", "Jayne": "public relations"]
//要创建一个空数组或者字典,使用初始化方法
let emptyArray = [String]();
let emptyDictionary = [String:Float]()
       
//如果类型信息可以被推断出来,你可以用【】和[:]创建空数组和空字典----就像你声明变量或者给函数传参数的时候一样。
shoppingList = []
occupations = [:]
print(shoppingList.isEmpty)//true

2.控制流

使用if和switch来进行条件控制,使用for-in、for、white和repeat-while来进行循环。包裹条件和循环变量括号可以省略,但是语句体的大括号是必须的

 let individualScores = [75,43,103,87,12]
 var teamScore = 0
 for score in individualScores{
    if score > 50 {
         teamScore += 3
    } else{
         teamScore += 1
    }
   }
 print("temaScore:",teamScore)//temaScore: 11
  • 在if语句中,条件必须是一个布尔表达式--这意味着像 if score {....}这样的代码将报错,而不会隐形的与0作比较。
  • 你可以一起使用if和let来处理值缺失的情况,这些值可由可选值来代表。一个可选值是一个具体的值或者是nil以表示值缺失。
    在类型后面加一个问号来标记这个变量的值是可选的
 var optionalString :String? = "hello"
 print(optionalString == nil)//false
 print(optionalString as Any)//Optional("hello")

 var optionalName:String? = nil
 var greeting="Hello!"
 if let name = optionalName {
     greeting = "Hello,\(name)"
 }
 print(greeting)//Hello!

使用for-in来遍历字典,需要两个变量来表示每个键值对。字典是一个无序的集合,所以他们的键和值以任意x顺序迭代结束。

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
                }
            }
         }
        print(largest) //25

使用while来重复运行一段代码知道不满足条件。循环条件也可以在结尾,保证能至少循环一次。

 var n = 2;
 while n < 100 {
         n = n*2//128
 }
 print(n)
 var m = 2
 repeat{
       m = m * 2
}while m < 100
 print(m)//128
  • 你可以在循环中使用..<表示范围,也可以使用传统的写法,两者是等价的
        var firstForLoop = 0
        for i  in 0..<4 {
            firstForLoop += i
        }
        print(firstForLoop)
        //总结: ..< 创建的范围不包含上届,如果想要包含的话需要使用...
        /*
         该中写法已经被swift3 废弃
        var secondForLoop = 0
        for var i = 0; i < 4; ++i {
            secondForLoop += i
        }
        print(secondForLoop)
        */

3.函数和闭包

  • 使用 func 来声明一个函数,使用名字和参数来调用函数。 使用-> 来指定函数返回值类型
 func greet(name:String,day :String) -> String{
       return "Hello \(name),today is \(day)"
}
var str = greet(name: "Bob", day: "Tuesday")
print(str)   //Hello Bob,today is Tuesday
  • 使用元组来让一个函数返回多个值,该元组的元素可以用名称或数字来表示
func calculateStatistics (scores:[Int]) -> (min:Int,max:Int,sum:Int){
  var min = scores[0]
  var max = scores[0]
  var sum = 0

for score in scores {
    if score > max {
             max = score
      } else if score < min
     {
             min = score
      }
      sum += score
    }
            return (min,max,sum)
 }
let statistics = calculateStatistics(scores: [5,3,100,3,9])
print(statistics.sum)//输出结果:120
print(statistics.2)// 输出结果:120 如果把2改成3 提示:Value of tuple type '(min: Int, max: Int, sum: Int)' has no member '3'
  • 函数可以带有可变个数的参数,这些参数在函数内表现为数组的形式
func sumOf(numbers: Int ...) -> Int{
var sum = 0
  for number in numbers {
      sum += number
     }
    return sum
}
    
var sum = sumOf(numbers: 42,597,12)
print(sum)//651
  • 函数可以嵌套。被嵌套的函数可以访问外侧函数的变量,你可以使用嵌套函数来重构一个太长或者太复杂的函数
 func returnFifteen() -> Int{
    var y = 10
    func add(){
           y += 5
      }
 add()
 return y
}
var y =  returnFifteen()
print("y=",y)//y=15
  • 函数是第一等类型,这意味着函数可以作为另一个函数的返回值
func makeIncrementer() -> ((Int) -> Int){  // swift3以后参数需要加括号,否则报错Single argument function types require parentheses
  func addOne(number: Int) -> Int{
        return 1 + number
    }
   return addOne
}
 var  increment = makeIncrementer()
 print("increment:",increment)//increment: (Function)
 increment(7)
 print("increment含参数:",increment)//increment含参数: (Function)

函数也可以当做参数传入另一个函数

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]
        var result = hasAnyMatches(list: numbers, condition: lessThanTen(number:))
        print(result)//true  当遇到数字7的时候就跳出本次循环了函数结束执行
     函数实际上是一种特殊的闭包:它是一段能之后被调取的代码。
     闭包中的代码能访问闭包所建作用域中能得到的变量和函数,即时闭包是在一个不同的作用域被执行的
     你已经在嵌套函数例子中看到,你可以使用{}来创建一个匿名闭包。使用in将参数和返回值类型声明与闭包函数体进行分离
     */
    numbers.map ({ (number:Int) -> Int in
        let result = 3 * number
        return result
    })
    /*
     有很多种创建更简洁闭包的方法,如果一个闭包的类型已知,比如作为一个回调函数,你可以忽略参数的类型和返回值。单个语句闭包会把它语句的值当做结果返回。
     */
    let mappedNumbers = numbers.map({number in 3*number })
    print(mappedNumbers)//[60, 57, 21, 36]
    
    /*
     你可以通过参数位置而不是参数名字来引用参数--这个方法在非常短的闭包中非常有用。
     当一个闭包作为最后一个参数传给一个函数的时候,它可以直接更在括号后面
     当一个闭包是传给函数的唯一参数,你可以完全忽略括号
     */
    let sortedNumbers = numbers.sort { $0 > $1 }
    print(sortedNumbers)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343