美文网首页iOS学习iOS开发iOS-swift
iOS Swift基础学习笔记(一)简单值(Simple Val

iOS Swift基础学习笔记(一)简单值(Simple Val

作者: 豆瓣菜 | 来源:发表于2017-01-15 20:41 被阅读46次

    Swift 初见

    通常来说,一个新的编程语言的第一个程序都是从在屏幕上打印“Hello,World!”开始的。在 Swift 中,只需一行即可实现:

    print("Hello, world!")

    如果你写过C或者Objective-C代码,那你应该很熟悉这种形式——在Swift中,这行代码就是一个完整的程序。你不需要为了输入输出或者字符串处理导入一个单独的库。全局作用域中的代码会被自动当做程序的入口点,所以你也不需要main函数。你同样不需要在每个语句结尾写上分号,就像上面打印“Hello,World!”一样。

    另外,为了获得更好的体验,我们可以通过 Xcode 的 playground 来编写 Swift 代码,这样我们可以马上看到自己所写代码的运行结果。

    简单值

    我们使用 let 来声明常量,使用 var 来声明变量。一个常量值在编译期可以不需要获取,但是只能为常量赋值一次。意思就是可以使用一个常量来表示一个值:只需声明赋值一次,就可以在多个地方使用。

    注意:给一个常量或变量赋值时,等号“=” 的左右两边都得有空格,否则会报错。

    var myVariable = 42

    myVariable = 50

    let myConstant = 32

    常量或者变量的类型必须和你赋给它们的值一样。当然,你可以不用显式地写出常量或变量的类型。声明的同时赋值的话,编译器会推断出它的类型。像上面的例子,编译器推断出 myVariable 是一个整型(integer),因为它的初值是一个整型。

    如果初值没有提供足够的信息(或没有初值),可以通过在变量的后面来指定它的类型,使用冒号隔开:

    let implicitInteger = 70

    let implicitDouble = 70.0

    let explicitDouble: Double = 70

    练习:创建一个显式的 Float 类型的常量,并指定值为4。

    值永远不会隐式地转换成其他类型。如果你需要将一个值转换成一个不同的类型,必须显式转换成其他类型的 instance,就跟下面的 String(width) 一样,生成了一个 String 类型的实例:

    let label = "The width is "

    let width = 94

    let widthLabel = label + String(width)

    注意:上面代码的最后一行代码‘+’必须应用于同一种数据类型操作。

    练习: 删除上面代码中最后一行的 String ,错误提示是什么?

    有一种更简单的将值转换成字符串的方式:把值写到圆括号中,并在圆括号前面加上一个反斜杠。

    let apples = 3

    let oranges = 5

    let appleSummary = "I have \(apples) apples."

    let fruitSummary = "I have \(apples + oranges) pieces of fruit."

    练习:使用\()来把一个浮点计算转换成字符串,并加上 人的名字,和他打个招呼。

    使用方括号[]来创建数组和字典,并在方括号[]使用下标或者键(key)来访问元素。

    var shoppingList = ["catfish", "water", "tulips", "blue paint"]

    shoppingList[1] = "bottle of water"

    var occupations = [

           "Malcolm" : "Captain",

            "Kaylee" : "Mechanic"  // key : value

    ]

    occupations["Jayne"] = "Public Relations"

    要创建一个空数组或者字典,可以使用初始化语法,需要指定其中的element 的类型。

    let emptyArray = [String]()

    let emptyArray1 = Array<String>()

    let emptyDictionary = [String : Float]()

    let emptyDictionary1 = Dictionary<String, Float>()

    如果类型信息可以被推断出来,你可以用[]来创建空数组和[:]来创建空字典——就像你给一个变量设置一个新值 或者 给函数传参数的时候一样。

    shoppingList = []

    occupations = [:]

    控制流

    使用`if`和`switch`来作为条件控制,使用`for-in`,`for`,`while`以及`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(teamScore)

    在`if`语句中,条件必须是一个布尔表达式——这代表诸如`if score {...}`这样的代码是错误的,并不能隐式地同0进行比较。

    你可以同时使用`if`和`let`来防止值的丢失。这些值是可选的,可选通过包含另一个值或者包含`nil`来指明该值不存在。通过在类型后面添加问号(?)来标记一个值为可选。

    var optionalString: String? = "Hello"

    print(optionalString == nil)  //可以删除`== nil`看看会得到什么结果

    var optionalName: String? = "John Appleseed"

    var greeting = "Hello!"

    if let name = optionalName {

    greeting = "Hello, \(name)"

    }

    练习:设置`optionalName` 为 `nil`,你得到的 greeting 的值会是什么?并且添加一个`else`子句用来在`optionalName` 为 `nil`时,为 greeting 设置一个不同的值。

    如果可选值为`nil`,则条件判断为`false`,花括号中的代码会被跳过。反之,可选值去包装并且赋给`let`后面的常量,使得去包装的值可以在代码块内部访问。(去包装可以认为代表着可选是有值的,而非nil,可以直接拿来用。)

    另一种操作可选值的方式,使用`??`操作符提供一个默认值。如果该可选值为 nil,设置的默认值将被使用。

    let nickName: String? = nil

    let fullName: String = "John Appleseed"

    let informalGreeting = "Hi, \(nickName ?? fullName)"

    switch 支持所有类型的数据,以及多种比较运算——不限于必须是整数,也不限于必须测试相等。

    let vegetable = "red pepper"

    switch vegetable {

    case "celery":

    print("Add some raisins and makes ants on a log.")

    case "cucumber", "watercress":

    print("That would make a good tea sandwich.")

    case let x where x.hasSuffix("pepper"):

    print("Is it a spicy \(x)")

    default:

    print("Everything tastes good in soup")

    }

    练习:尝试删除 default case,会得到什么样的错误?

    注意上面代码中在一个模式中如何使用 let 来将匹配模式的值赋给一个常量。

    执行完匹配到的 case 后,程序会跳出 switch,而不是继续执行下一个 case,所以不需要在case 的代码后面添加 break 来跳出 switch。

    使用`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

    }

    }

    }

    print(largest)

    练习:添加一个变量来跟踪哪一种数值是最大,以及最大的那个数值是什么。

    使用`while`来重复执行一个代码块直到条件改变。循环条件可以放在最后,用于保证循环至少被执行一遍。

    var n = 2

    while n < 100 {

    n = n * 2

    }

    print(n)

    var m = 2

    repeat{

    m = m * 2

    } while m < 100

    print(m)

    你可以在一个循环中使用`..<`使索引在一个范围内。

    var total = 0

    for i in 1..<5 {

    total += i

    }

    print(total)

    使用`..<`来创建一个忽略最高值的取值区间,使用`...`构造的范围则同时包含最高值和最低值。

    `_`表示一个通配符,当你不需要知道当前执行的循环是哪一次时可以使用它

    var secondLoop = 0

    for _ in 0...3{

    secondLoop += 1

    }

    print(secondLoop)

    相关文章

      网友评论

        本文标题:iOS Swift基础学习笔记(一)简单值(Simple Val

        本文链接:https://www.haomeiwen.com/subject/bqvebttx.html