Swift from Scratch: Variables and Constants

在Swift from Scratch系列的第一篇文章中,你学习了Xcode playgrounds,烙下了你Swift旅程的起始代码。在这篇文章中,我们通过探索变量和类型开始学习swift编程语言的基础。我们同样会仔细探访探访常量,看看为什么我们鼓励你尽可能的使用常量。
在接下来的系列中,我们会好好利用Xcode提供的playgrounds来学习swift编程语言的基础。正如我们在前一篇文章中看到的,playgrounds绝壁是教授和学习swift的最佳去处。
让我们以开辟新的playground来开始我们今天的tutorial,我鼓励你跟着做,实践语言是学习其语法和理解其概念的好方法。
开启Xcode,创建playground。

清空playgrounds的内容,我们在前一篇tutorial中已经使用了变量,让我们凑近点,发掘其细节,以便更好的认识swift在幕后做的工作。

Variables

Declaring Variables

在swift中,我们使用var这个关键字来声明变量,尽管这和其他编程语言中如何声明变量类似,我强烈建议你在swift中使用var时能够摒弃你在别的编程语言中已经形成的思考模式,因为存在着一些重要的区别。
var是swift中声明变量的唯一手段。var最常用和简洁的用法就是声明一个变量,赋予其变量值

    var street="5th Avenue"

记住我们不以分号结束语句。尽管分号在swift中是可选择的,我们还是能不使用就忽略其价值。
你也许已经注意到了我们在声明变量的时候没有指定其类型,这给我们带来了swift的关键特性之一,类型推断。

Type Inference

上面的变量声明和赋值语句可能会造成那些习惯js或者php的人一个错觉,以为swift是没有类型或者类型松散的语言。请原谅我再一次重申,swift绝壁是强类型语言。type safety是该语言的一块房角石。
swift才刚刚向我们展示它的魔力。尽管上面的语句没有刻意的指定类型,但是street变量的类型是string。这是swift类型推断的表现,我们赋予street一个string,swift有足够的智商,将street的类型设定为string。
下面的语句给了我们相同的结果,差别是我们刻意的设定了变量类型。上面的语句字面上表达了street是string类型。

var street:String="5th Avenue"

swift要求你要么显式要么隐式地设定常量和变量的类型。如果你不这样做,swift会抛出error来抱怨。将下面的代码加到playground看看我所表达的意思。

var number

这个语句在php或者js是完全能够接受的。在swift,这是无效的。原因很简单。尽管我们使用var声明了一个变量,我们没有指定变量的类型。因为我们没有赋值,swift不能够推断类型。

我们可以通过两种途径解决这个问题,我们可以赋予一个值,或者我们显式的指定该变量的类型。下面的代码显式的指定number的类型是string。

    var number:String

Changing Type

正如你所看到的,给street和number赋予新值很简单并且没有意外。

var street:String="5th Avenue"
var number:String
street="Main Street"
number="10"

将数字10赋给number变量会不会更容易点。将街道号存储为字符串没有必要。让我们看看如果我们这样做了会怎么办。

var street:String="5th Avenue"
var number:String
street="Main Street"
number=10

如果我们将整数赋给number,Xcode会抛出错误。不太幸运的是,这次这个错误信息显得不是非常有用。Xcode抛出错误是因为我们试图将整数赋给一个字符串类型的变量。在类型松散的语言中这不是问题,但是在swift中这不可取。
swift是强类型语言,每一个变量都是有指定的类型且类型不能够改变。再一次的阅读这句话,将其深深地刻在你的脑子里,这是swift的一个重要概念。
为了搞定这个错误,我们需要将number声明为Int类型。

var street:String="5th Avenue"
var number:Int
street="Main Street"
number=10

Summary

记住下面要说的非常重要。你可以用var声明一个变量,且不需要显式的声明变量的类型,然而,记住每个变量和常量在swift中都有类型。如果swift不能推断类型,它就会抱怨。每一个变量都有类型且类型不可改变。

Constants

常量在类型上和变量类似。唯一的区别就是常量一旦有值该值不能再次改变。常量的价值在于量恒久不变。

Declaring Constants

声明常量用let关键字。

let street:String="5th Avenue"
var number:Int
street="Main Street"
number=10

如果我们只更新第一行,将var改为let,Xcode会抛出错误。在swift中改变常量的值式不允许的。

Using Constants

我希望我们能达成共识,在swift中声明常量非常简单。声明常量和声明变量一样方便,而且这不是巧合。
swift鼓励使用常量。如果一个值不会改变或者你期望它不改变,那么他就应该是常量。这有很多好处,其中之一就是性能,但是更重要的好处是安全性。在任何需要常量的时候使用常量,你在你的代码上加了限制

Data Types

大多数编程语言都有很多类型来存储字符串,整数,浮点数。swift中的类型很有限,看看下面列出的

  • Int
  • Float
  • Double
  • String
  • Character
  • Bool

要知道上面的类型不是基本或者原始类型。他们是命名的类型,是swift用结构实现的类型。我们在系列中会更详细地探索结构,但是要知道这里提到的这些类型并不是和你已经使用过原始类型一样。
swift中还有很多数据类型,例如元组,数列,字典。我们会在后续的系列中一一阐述。

Type Conversion

还有一个主题有待讨论,类型转换。看看下面的oc代码,会输出314.000000到控制台。

int a=100;
float b=3.14;
NSLog(@"%f",(a*b));

oc在运行中会将a转换为浮点数,然后和b相乘。让我们用swift重写上面的代码

var a=100
var b=3.14
println(a*b)

暂时忽略println,我首先想聚焦在a与b的乘积上。swift推测a为Int,b为Double。然而,当它对ab相乘时,它注意到ab不是相同的类型。这对于你来说不是一个问题,但是对于swfit来说却是。swift不知道相乘的结果应该是什么类型。它该是整形还是浮点。下面的代码解决了问题

var a=100
var b=3.14
println(Double(a)*b)

注意a的类型没有改变。尽管上面的代码看上去像是类型cast,但是不是一回事。这个Double函数吃进去a,吐出一个Double a,这个结果再与b相乘。结果的类型是Double。
你需要记住的是swift和c或者oc不同。它不会隐式的转换变量或者常量的值。这是一个需要掌握的概念。

在前面的代码样本中,我们调用了函数,println,这个函数和oc的NSLog相似,它输出某些东西然后附着一个换行。swift的标准库也包括了print函数,干着相同的勾当,但是偷懒不加换行。

var string="this is a string"
let constant=3.14
println(string)
println(constant)
println(10*50)
println("string literal")

也可以通过字符串插值来结合变量,常量,表达式和口语。swift的字符串插值非常简单,只要将变量,常量,表达式用()包裹起来。

let street="5th Avenue"
let number=10
println("She lives at \(street) \(number)")

Conclusion

理解swift怎样处理变量和常量非常关键。尽管习惯常量的概念需要花点时间,一旦你掌握了,你的代码会变得非常安全和容易理解。在下一期的tutorial中,我们会继续探索swift的collections。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值