Swift复习系列:基础部分

前言说明

1.Swift是一种类型安全语言,你可以清楚的知道值的类型,当你想传入一个Int类型的数据,类型安全会阻止你不小心传入String或者其它类型
2.Swift包含C和Objective-C上所有的基础数据类型,同时还提供ArraySetDictionary三个集合数据类型。
3.Swift新增高阶数据类型,比如元组Tuple,用于创建或者传递一组数据,比如它可以作为函数返回值来返回多个值;Swift增加可选类型(Optional)类型,用于处理值缺失的情况,它类似于nil,但它可以用于任何类型,同时比nil指针更加安全。

一、常量和变量

1.声明变量和常量
    let constantValue = 233
    var variableValue = 0

    var xx = 1, oo = 2
    let pyl = 233, uzi = 100

1.用let来声明常量,且声明之后,值不可改变
2.用var来声明变量,一定要设置初始化值,否则会报Type annotation missing in patternClass 'ViewController' has no initializers错误。变量声明之后,值可以改变。
3.我们可以使用varlet来同时声明多个变量或常量,中间要用逗号隔开;

2.类型标注,给常量或变量显式地指定数据类型

Swift可以根据你声明的变量或常量来隐式地推断数据类型,当然,你也可以显示地给数据进行类型标注,指定数据类型,如下:

var myFirstValue:String = "This is my first string value."
let mySecondVlue:Int = 101

我们可以在变量或常量名称后面加载:TypeName来给数据显式指定数据类型,比如,给myFirstValue指定数据类型为String类型

3.常量和变量的命名

你可以使用你喜欢的任何字符(包括Unicode字符)来作为变量名,不过不能以数字开头也不能使用数学符号保留的或者非法的Unicode字符码位连线/制表符
注意↓↓↓

一旦为常量或变量指定确定的类型,就不能使用相同的名字再次进行声明,不能改变其存储值的类型,同时也不能将常量与变量进行相互转换。

4.常量和变量的输出

你可以使用NSLog(format: String, args: CVarArg...),这样和Objective-C上面的类似。接下来说的是print( )输出语句。
我们可以直接使用print(items: Any..., separator: String, terminator: String)print(items: Any...)来输出一个或者多个变量或者常量的值,如

print(constantValue) //输出的结果是常量constantValue的值
print(constantValue,variableValue)//输出的结果是常量constantValue的值

print(items: Any..., separator: String, terminator: String)中,当输出多个变量/常量时,我们可以给separator设置值来在每两个变量/常量之间添加一些信息,同时也可以给terminator设置值来在输出末尾显示一些其它信息,当然你也可以传递空字符" "给它们,如下,

 print(constantValue, variableValue,separator: "\n", terminator: "\nOther messages.")

输出结果为:

233
0
Other messages.

也可以通过print("string\(常量或变量名称)")的方式来输出,如

print("I have\(constantValue)apples") //输出结果:I have 233 apple

二、Swift标记和注释
常用标记:

    // TODO:这是一个标记说明
    // MARK: 这也是一个标记说明
    // FIXME:这是一句提醒说明

效果如下,


屏幕快照

常用注释:

    //这是一句单行注释
    /*这是多行注释*/

    /*
     *这样可以写很多注释
     */

三、Swift数据类型和数据范围

1.整数类型

Swift中整数类型可以是有符号(Int)的(正数负数)或者无符号(UInt)的(正数)
我们可以通过.min.max来获取整数数据表示范围的最小值和最大值

let minValue = Int64.min
let maxValue = Int64.max
print(minValue,maxValue, separator: "\n", terminator: "\nInt64的数据类型范围")

输出结果

-9223372036854775808
9223372036854775807
Int64的数据类型范围

也就是说Int64的数据类型范围为-9223372036854775808 ~ 9223372036854775807

Swift中,Int为特殊的整数类型,长度与当前平台的原生字长度相同。

32位平台上,IntInt32长度相同.
64位平台上,IntInt64的长度相同.

UIntInt一样,只是UInt是无符号的。

2.浮点类型

浮点数据的表示范围比整型数据的范围更大,它可以表示比整型数据更大或者更小的数据。在Swift中提供了FloatDouble两种浮点数据类型。
其中,Float表示32位浮点数据Double表示64位浮点数据,在数据处理中,如果两个类型都匹配,优先选择Double

四、类型推断、类型安全以及类型检查
Swift是类型安全(type safe)的语言,它可以清楚的让你知道所处理数据值的类型,当你需要传入一个Int类型的数据时,在编译的时候,Swift类型安全(type safe)会进行类型检查(type checks),把不符合的类型标记为错误,所以你绝对不会错误的传进去一个String类型的数据。
当你在声明一个变量或者常量式,只给他们一个字面量(Literals)而没有显式指定数据类型时,类型推断(type inference)会根据情况来指定合适的数据类型,如下

let xxoo = 12 //xxoo会被指定为Int类型
let py = 12 + 3.1412926//py会被指定为Double

注意,当推断浮点数据时,总是优先选择Double,而不是Float.

五、数值型字面量
整数字面量可以被写作:

1.十进制数据,没有前缀;
2.二进制数据,前缀0b
3.八进制数据,前缀0o
4.十六进制数据,前缀0x

浮点字面量可以是十进制或者是十六进制,小数点两边必须至少有一个十进制(或十六进制)数字。

十进制浮点数也可以有一个可选的指数(exponent),用大小或小写的e来表示。
如果一个十进制浮点数的指数为exponent,则该浮点数可以表示为基数*10^exponent,如下

1.25e2 = 1.25*10^2
1.25e-2 = 1.25*10^-2

十六进制浮点数必须有一个指数,用大写或小写的p来表示。
如果一个十六进制浮点数的指数为exponent,则该十六进制浮点数可以表示为基数*2^exponent,如下

0xFp3 = 15 * 2^3
0xFp-3 = 15 * 2^-3

下面插入一下16进制小数转化为10进制小数的步骤,如0xC.35p0 ↓↓↓↓↓↓

在十进制中,小数点后第一位为十分位,第二位为百分位,以此类推......
在十六进制中,小数点后第一位为16分位,第二位为256分位,以此类推......
所以十六进制的小数0xC.35p0转化为十进制小数位(12 + 3/16 + 5/256)*2^0,结果为12.2070312*2^0 = 12.2070312

数值类字面量可以包括额外的格式来增强可读性。整数和浮点数都可以添加额外的零并且包含下划线,不会影
响字面量:

let paddedDouble = 000123.456
let oneMillion = 1_000_000
let justOverOneMillion = 1_000_000.000_000_1

五、类型别名
我们可以通过类型别名(type aliases)来给现有类型起一个别名。

    typealias Hahahahaha = Int64
    var haha = Hahahahaha.min
    var ahah = Hahahahaha.max

我们通过关键字typealiasInt64类型起一个别名为HahahahahaHahahahaha具有Int64类型所有的功能。

六、元组
元组(tuple)是一个许多不同类型数据值的集合(这是个人理解),它不像数组Array一样要求里面的元素必须是同一类型。如下,

var httpReturnCode = (200,"Success",[1,12,44])

我们定义了一个元组类型的数据,名称为httpReturnCode,值为(200,"Success",[1,12,44])

我们可以通过内容分解来获取和使用元组中的数据,如下

let httpReturnCodeTuple = (200,"Success")
let (code,message) = httpReturnCodeTuple
print("Login return code is \(code),message:\(message)")

当我们只想使用元组中的一部分数据时,可以通过下面的方式,即用( _ )来代替其它不略和不需要的部分。

let (loginCode,_) = httpReturnCodeTuple
print("Login code is\(loginCode).")

我们还可以通过下面的方式,来声明、获取和使用一个元组,即在声明的时候给每个元素单独命名,然后通过下标来访问

let httpReturnCodeTuple = (httpCode:200,httpMessage:"Success")
print("Login return code is \(httpReturnCodeTuple.httpCode),message:\(httpReturnCodeTuple.httpMessage)")

关于元组的比较
Bool类型的值不能比较,所以当元组中有Bool值时,不能用于两个元组的比较。元组比较会按照从左到右、逐值比较的方式,知道发现有两个值不等时停止。如果所有值相等,那么这两个元组就是相等的。请看下面的例子,

        let tuple01 = (1,"swift")
        let tuple02 = (3,"ObjC")
        let tuple03 = (3,"swift")

        if tuple01 >= tuple02
        {
            print("True")
        }
        else
        {
            print("False")
        }

        if tuple02 < tuple03
        {
            print("True")
        }
        else
        {
            print("False")
        }

输出的结果是:FalseTrue
因为tuple01tuple02比较时,1 < 3,此时停止比较,tuple01 < tuple02.但是,当tuple02tuple03比较时,3 = 3,接下来就开始比较ObjCswift两个字符串的大小,ObjC < swift,所以tuple02 < tuple03.

接下来穿插一下Swift中两个字符串大小的比较规则,
Swift中字符串的大小比较是逐位比较Unicode编码大小

1、如果第一位不同,则哪个第一位的值大就是哪个大
2、如果第一位相同,则比较第二位,规则一样
3、以此类推

七、可选类型
可选类型(optionals)用于处理值可能缺失的情况,它包含的意思如下,

有值,等于未知数x

没有值

注意

CObjective-C中并没有可选类型这个概念。最接近的是 Objective-C中的一个特性,一个方法要不返回一 个对象要不返回nilnil表示“缺少一个合法的对象”。然而,这只对对象起作用——对于结构体,基本的 C 类型或者枚举类型不起作用。对于这些类型,Objective-C方法一般会返回一个特殊值(比如 NSNotFound)来暗示值缺失。这种方法假设方法的调用者知道并记得对特殊值进行判断。然而,Swift的可选类型可以让 你暗示任意类型的值缺失,并不需要一个特殊值。

Swift中,我们可以通过Int的一种构造器将String类型转化为Int类型,比如我们可以将String类型的“110”转化为Int类型的“110”,如下,

        let gouString:String = "110"
        let gouInt = Int(gouString)
        print(type(of: gouInt))

控制台输出为:Optional<Int> 也就是说gouInt常量会被推断为Optional Int类型,而不是Int类型。因为gouString通过构造器转化为Int值时,可能成功,有值;也可能失败,没有值。

可选类型(optionals)nil

Swift中,nil可以给可选变量(划重点,注意,是可选)赋值,表示它没有值。当声明一个可选的变量或常量而没有赋值时,它们会被自动设置为nil,如下,

        //xxx会被赋值为nil
        var xxx:String?
        print(xxx)

但是,有一点需要注意,SwiftnilObjective-C 中的 nil 并不一样。在Objective-C 中, nil 是一个指向不存在对象的指 针。在 Swift 中, nil不是指针——它是一个确定的值,用来表示值缺失。任何类型的可选状态都可以被设 置为 nil,不只是对象类型。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351

推荐阅读更多精彩内容