The basics of swift

前端之家收集整理的这篇文章主要介绍了The basics of swift前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

原文出自:标哥的技术博客

前言

Swift是iOS、OS X和WatchOS平台新的开发语言。尽管如此,Swift有很多是与我们使用过的C和Objective-C开发经验是很像的。

Swift提供了自己版本的C和Objective-C基础数据类型,包括整型Int、浮点型Double和Float、Boolean值Bool和字符串类型String。Swift还提供了三个强大的基本集合类型Array、Set、Dictionary。

与C语言一样,Swift使用变量存储和通过唯一标识名获取值。Swift也有值不可变的,称为constants,它是比C的常量要强大得多。Swift通过使用常量可使代码更安全且更清晰。

除了我们熟悉的类型外,Swift引入了在Objective-C中没有的高级数据类型,比如元组(Tuples)。元组使我们可以创建和传一组类型相同或者不相同的值。我们可以使用元组作为函数返回值。

Swift还提供了可选类型(Optional Type),用于处理可空值。可行类型表示“它有值,且值为x或者它根本没有值”。使用Optionals与Objective-C中使用指针nil很像,但是Optionals可以是任意类型,而不仅仅是类。Optionals不仅仅是安全,而且比nil指针语意更清晰明了,它们是Swift最强大的特性之一。

Swift是类型安全的语言,这意味着我们所写的代码的类型必须是明确的,不能隐匿转换。比如,如果我们希望是Float类型,却传一个Int类型,那么是不可行,编译器会抱错。

注明:Swift版本为2.1

测试环境:xcode 7.2

常量与变量

常量与变量都通过一个名称与之关联一个指定类型的值。常量的值一旦设置,不能再修改,而变量是可以随时修改值的。

常量

声明常量使用关键字let来声明,声明时可不明确指定常量的数据类型,交由编译器来推断:

// 常量和变量必须在使用前声明,用let来声明常量,用var来声明变量
// 常量在声明时,要求初始化,且不能更改
// 如果是局部常量,就使用驼峰命名规则即可
let blog = "http://www.henishuo.com";

// 如果是全局的常量,个人习惯以小写k开头,后面单词首字母大写
// 本人不习惯看全大写,因此更喜欢这种风格
let kWebsiteTitle = "标哥的技术博客";

当然,有的时候我们是不能省略类型说明的,比如Float和Double类型,若我们期望的是Float类型,则必须指定数据类型为Float类型,否则默认编译器就会推断为Double类型:

// 指明数据类型
let maxCost: Float = 2000.0

// 最大并发数量设置为全局,则可以这么定义
// 可以指定类型为Int,则指定也没有关系,编译器会推断出来为Int
let kMaxCocurrentCount: Int = 4

可能注意到了代码句后面的分号可有可无,通常都不添加

变量

声明变量使用关键字var来声明。

类型自动推断

// 类型自动推断
// 推出类型为Int <=> var x: Int = 1
var x = 1

// 推断出类型为String <=> var string: String = ...
var string = "编译器自动推断出类型String"

一行声明多变量

// 可以一行声明多个变量
// 虽然可以一行声明多个变量,但是建议不要这么做,一行声明一个更可读
var x1 = 0,x2 = 1,x3 = 2

// 连续多个变量声明时,只需要对最后一个变量指定类型,其它几个变量类型也会被声明为指定的类型
var s1,s2,s3: String

// 抱错,类型不一致,s1是String类型
// s1 = 1
s1 = "s1"
print(s1)

虽然可以一行声明多个变量,也可以只指定最后一个变量的数据类型,但是不推荐这么做。在开发中一定要清晰,因此最好一行只声明一个变量。

类型标注

// 变量声明时,可以明确指定类型
var xx: Int = 0

添加类型标注的方式是很简单的,就是在变量名的后面添加冒号跟着数据类型。比如上面的就是变量名xx后面跟着: Int。为了更美观,通常会在冒号后面添加一个空格。

分号可有可无

// 一般情况下,在swift中分号是可有可无的
var seg = 1;
var seg1 = 1

但是,如果一行声明多个变量,像这样就必须添加分号:

var seg11 = 1; var seg111 = 2

如果不添加分号就会抱错,因为编译器也分不清了。

整数

// Swift 提供了8,16,32和64位的有符号和无符号整数类型。分别为:
// (U)Int8,16,32,64
//
// 定义有符号整数,基本都是使用Int就可以了
// Int
// 一般来说,你不需要专门指定整数的长度。Swift 提供了一个特殊的整数类型Int,
// 长度与当前平台的原生字长相同:
//
// 在32位平台上,Int和Int32长度相同。
// 在64位平台上,Int和Int64长度相同。
var number: Int = 10
print(Int.max)
print(Int.min)

进制

// 一个十进制数,没有前缀
// 一个二进制数,前缀是0b
// 一个八进制数,前缀是0o
// 一个十六进制数,前缀是0x
var decInt = 17
var binInt = 0b10001
var octInt = 0o21
var hexInt = 0x11

类型转换

Swift是强类型语言,不允许隐式转换,因此类型不相同时必须手动转换类型,不能赋值,否则编译器会报错:

var intType = 10
var doubleType = 10.0
// 报错,类型不一致,必须手动转换
//intType = doubleType
intType = Int(doubleType)

类型别名

使用类型别名,通过关键字typealias来声明,格式为:typealias 类型别名 = 原类型名。使用类型别名的好处是使语义更明确。

typealias IntType = Int

// IntType其实就是Int
let valueObject: IntType = 10

print(valueObject)

Bool值

Swift中的真假值用true、false表示,与objective-c中的YES、NO表示的意思一样的。

var isDoing: Bool = false

var isSuccessful = true

Unicode字符变量

我们可以使用中文命名,也可以使用表情符号命名,但是真正开发中是不允许的,因为这会引来很多麻烦。再说,这么多年来都习惯了英文命名,用中文命名会让很多人无法接受的,而且也不好输出

var 你好 = "你好世界"
var ���� = "dogcow"

打印

首先打印使用print函数,字符串中使用\(变量名)

var name = "标哥"
print("大家都叫我:\(name)")

注释

在Swift中,对于单行功能注释通常使用//,对于公开的属性或者变量添加的注释通常使用///,通过代码功能注释,通常使用/* */:

/// 注释风格一
// 注释风格二
/* 注释风格三 /*在swift中可以嵌套注释*/ */
var comment = "注释"

元组

元组是使用圆括号来声明,元组中的元素的数据类型可以是任意的,不要求相同。访问元组的值,可以通过序列0,1,2…,也可以在声明时指定元组各个元素的名称,然后通过名称获取值:

// swift中增加了元组类型,元组内的值可以是任意类型,并不要求是相同类型。
// 声明方式,直接用圆括号
let http404NotFound = (404,"Not Found")
// 可以用.0,2...访问值
print(http404NotFound.0)
print(http404NotFound.1)

// 如果只要其中一部分值,可以用_过滤
let (httpCode,_) = http404NotFound
print(httpCode)

// 可以给元组中的每个元素全名
let httpStatus = (code: 404,description: "Not Found")
print(httpStatus.code)
print(httpStatus.description)

当我们不需要接收某些值时,我们可以通过下划线_来过滤。这种用法是很常见的,使用非常广泛。

Optionals

对于可选类型,官方的说明是:”There is a value,and it equals x”或者”There isn’t a value at all”。也就是说,它要么有值x,有么没有值。

使用?声明为可选类型,当它没有值是,这就是nil。只有声明为可选类型,值才可以设置为nil。

// 可选类型
// 用?表示可选类型,通过用可选绑定判断是否有值
var optionalValue: Int?

If语句和强制拆包

我们可以使用==或者!=来判断:

var convertedNumber: Int? = 123

if convertedNumber != nil {
   print("value is \(convertedNumber!)")
}

Optional Binding

通过if let value = optionalValue {}的方式来绑定值:

if let value = optionalValue {
  print("有值的")
} else {
  print("是空的")
}

optionalValue = 10
if let value = optionalValue {
  print("有值的")
} else {
  print("是空的")
}

多个Optional Binding

如果有多个,则只需要一个let声明即可,当然也可以分别写,每个之间使用逗号来分开。其结果为,只有所有都是有值的,才会为true,否则为false:

var op1: Int?
var op2: Int?
op1 = 1
// 对于多个可选,只有都有值才会执行{}内的内容
if let lhs = op1,rhs = op2 {
  print("都有值")
} else {
  print("不都有值")
}

op2 = 2
if let lhs = op1,rhs = op2 {
  print("都有值")
} else {
  print("不都有值")
}

Implicitly Unwrapped Optionals

隐式解析可选类型值,需要在声明是使用!而不是?,这是告诉编译器,一旦赋值,它都会有值,但是若在获取值时,它却没有值,则会崩溃。

// 如果变量一开始没有值,但是一旦赋值后,保证一直有值,则可以用!来声明
var name: String! // 后面会有值
name = "我会有值的"
print(name)// 使用时不用加!

// 可以使用!,也可以不使用,但是一定要保证有值,否则会crash
var lili: String = name!
print(lili)

Error Handling

swift中提供了异常处理机制,使用throws抛出异常,交由外部处理。如下:

enum LessThanErrorType : ErrorType {
  case LessThanZero
}

func throwErrorFunc(number: Int) throws {
  if number <= 0 {
    throw LessThanErrorType.LessThanZero
  }

  print("number = \(number)")
}

外部就可以通过下面的方式来调用并捕获异常:

do {
  try throwErrorFunc(-1)
} catch {

}

如果要细分各种异常处理,则可以使用多个catch:

do {
  try throwErrorFunc(-1)
} catch LessThanErrorType.LessThanZero {

} 
// 若前一个不符合条件,则会进入这个捕获所有类型的异常处理
catch {

}

断言(Assertions)

断言在开发中有一定的作用的,首先我们在代码调试的时候,可以添加断言来处理数据是否满足要求,比如必传字段出现空,则可以通过断点将不满足的条件抛出来。

// 断言通常是用于诊断条件是否满足,如果不能满足就会中断程序
var optoinalValue2 = "我不是空的"
assert(optoinalValue2.isEmpty == false)// 条件为真,跟什么都没做一样

// assertion Failed: : file <EXPR>,line 86
assert(optoinalValue2.isEmpty == true)

// 我们也可以传失败信息
// assertion Failed: optoinalValue2不为空: file <EXPR>,line 89
assert(optoinalValue2.isEmpty == true,"optoinalValue2不为空")

// 还提供了直接断言失败的API:
// fatal error: : file <EXPR>,line 92
assertionFailure()

// 也支持断言失败提示信息:
// fatal error: 反正是失败了: file <EXPR>,line 96
assertionFailure("反正是失败了")

写在最后

本篇博文是笔者在学习Swift 2.1的过程中记录下来的,可能有些翻译不到位,还请指出。另外,所有例子都是笔者练习写的,若有不合理之处,还望指出。

学习一门语言最好的方法不是看万遍书,而是动手操作、动手练习。如果大家喜欢,可以关注哦,尽量2-3天整理一篇Swift 2.1的文章。这里所写的是基础知识,如果您已经是大神,还请绕路!

关注我

如果在使用过程中遇到问题,或者想要与我交流,可加入有问必答QQ群:324400294

关注微信公众号:iOSDevShares

关注新浪微博账号:标哥Jacky

支持并捐助

如果您觉得文章对您很有帮助,希望得到您的支持。您的捐肋将会给予我最大的鼓励,感谢您的支持

支付宝捐助 微信捐助
@H_301_661@ @H_301_661@

猜你在找的Swift相关文章