IOS Apps 开发(Swift)(2)——Learn the Essentials of Swift(1)

前言:网上一直没有找到用Swift开发IOS的好的教程,所以找了官网的文档翻译一下算了。如有错误欢迎指正。博主首发CSDN,mcf171专栏。

博客链接:mcf171的博客

原文链接:Learn the Essentials of Swift

——————————————————————————————

第一节课是通过Swift playground进行展现,playground允许我们修改code并且直接在Xcode上马上看到结果。Playground对于学习和实验也是一个不错的助手,能够让我们加速对于Swift 概念的基础学习。


可以下载以下课程文件在Xcode中打开从而进行学习。

Download Playground


学习目标

在本次课程中,你可以了解到:

  • 常量和变量的不同
  • 明白什么时候使用隐式声明什么时候用显示声明
  • 理解使optionals的好处和optional绑定
  • optionals和隐式 unwrapped optionals的区别
  • 理解条件语句的目的和循环
  • 使用switch语句来进行条件分支
  • 使用where关键字来增加在条件语句中的额外约束
  • 函数,方法和初始化的不同
  • 类,结构体和枚举的不同
  • 理解继承和接口
  • 使用Xcode的quick help快捷键来决定隐式类型和发现额外信息。
  • Import和使用UIKit

基本类型

常量就是指在第一次声明之后它的值不再进行改变。相应的变量就是之后值可以进行变换的。如果我们知道一个值将不会在我们的代码中改变,那么可以将它声明为常量而不是变量。

使用let来声明常量,var声明变量

var myVariable = 42
myVariable = 50
let myConstant = 42
ps:在Xcode中,option+click可以查看一个常量和变量的类型。可以在Xcode上进行试验。


变量不会自动的从一个类型隐式转换为其他的类型。如果需要讲一个值转换为不同的类型,那么要进行显示的描述。

let label = "The width is "
let width = 94
let widthLabel = label + String(width)
ps:可以尝试移除最后一行的String,看看能出现什么错误。


同时也有一个简单的方法在string中加入值:在括号中写值。同时在括号前面加一个反斜杠(\)。

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

使用optionals来处理可能为空的值,一个optional值可以包含一个确切的值或者nil(空值)。通过在类型后面加?号来标记值为optional

let optionalInt: Int? = 9

(博主暂时也不太了解这个)为了理解一个optional的潜在类型,那么需要拆包(unwrap)这个变量。在后面将进一步学习unwrapping optionals,最直接unwrap的方法是在变量后面加一个!,只有确定这个值不是nil的时候才可以使用这个操作。

let actualInt: Int = optionalInt!

ps:大家可以尝试去掉:Int会报错。


Optionals 在Swift中是非常普遍的,同时对于一些一个值可能有也可能没有的这样场景非常适用。这对于类型转换时非常有用的。
var myString = "7"
var possibleInt = Int(myString)
print(possibleInt)

在上述代码中。 因为myString包含了一个整型值,所以possibleInt是7。但是如果将myString进行改变为不能转换为整数的值,那么possibleInt就是空值
myString = "banana"
possibleInt = Int(myString)
print(possibleInt)

数组是一系列数据的有序集合,通过[]进行数组的创建,通过下标来访问数组成员,数组下标从0开始
ar ratingList = ["Poor", "Fine", "Good", "Excellent"]
ratingList[1] = "OK"
ratingList

可以使用以下语法创建一个空的数组
// Creates an empty array.
let emptyArray = [String]()

大家可以注意上述有一个注释,注释是源代码文件中的一个文字片段,并不会在编译的时候作为程序的一部分,但是提供了描述信息和有用的特点代码块的有用信息。单行的注释是通过//,多行的注释是/*....*/

(博主也没太懂)当一个隐式的unwrapped optional不用再每次访问时都需要拆开这个optional来获取值,那么这个unwrapped optional值的也是一个optional,可以像一个非optional的值一样来进行使用。这是因为一个隐式的unwrapped optional通常假设在值初始化之后都是有值的,尽管这个值可能会改变。隐式的unwrapped optional类型通过!进行声明而不是?
var implicitlyUnwrappedOptionalInt: Int!

在之后我们自己的代码中可能很少用到上述的隐式unwrapped optional。但是在之后的课程和API中你会经常看到这种表示。

控制流

Swift有两种控制流语句。条件语句:比如说if和switch。循环语句:for-in和while。

(具体描述省略)

let number = 23
if number < 10 {
    print("The number is small")
} else if number > 100 {
    print("The number is pretty big")
} else {
    print("The number is between 10 and 100")
}
ps:修改number的值来观测不同的number值对于最后输出的影响


这些语句可以进行嵌套来进行创建复杂、有趣的一些行为。下面是一个for-in中嵌入了一个if-else语句

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语句中使用optional赋值(optional binding)来检测optional是否包含一个值

var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
    greeting = "Hello, \(name)"
}
ps:将optionalName设置为nil,看看会有什么变化。

同时也可以使用一个if语句来赋予多个值。where关键字用来增加额外的约束。下述代码当且仅当所有的赋值成功。
var optionalHello: String? = "Hello"
if let hello = optionalHello where hello.hasPrefix("H"), let name = optionalName {
    greeting = "\(hello), \(name)"
}

switch 在Swift中是非常强有力的。一个switch语句支持任何类型的数据和多种多样的比较操作符。在下述例子中,switch语句是对于vegetable字符串的值进行分值。
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."
}
ps:可以尝试一掉default语句看会出现什么错误

注意let关键字被用来接受分值的值,这个被匹配的值肯定是一个常量。就像在if语句中,通过添加where关键字进一步限定条件语句。但是又不同于if语句中的使用,因为一个switch case是可以有多个匹配条件的,只要有一个条件满足就可以执行。

在执行了满足匹配的case下的代码之后,程序会退出switch语句,而不是执行下一个case,所以我们不需要通过break来退出switch。

switch语句必须是完整的,也就是说default case是必须的,除非所有的情况都能被对于这个switch中至少一个满足。比如说switch语句是一个枚举类型。

同时可以在循环中使用Range。使用半开的范围操作符..<来确保一个索引的范围。
var firstForLoop = 0
for i in 0..<4 {
    firstForLoop += i
}
print(firstForLoop)

这个半开的范围操作符 ..< 不包含上边界。所以范围是[0,4) 如果使用的是... 则包含两个端点。
  1. var secondForLoop = 0
    for _ in 0...4 {
        secondForLoop += 1
    }
    print(secondForLoop)


    上述代码是从0到4,一共迭代5次。下划线是代表一个通配符,当我们没必要知道当前执行的迭代是什么的时候,我们可以使用下划线。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值