the swift programming language 5

第1章:基础知识

2019-01-31  本文已影响0人  行知路

  swift是通用于iOS、MacOS、watchOS、tvOS的编程语言,其提供了C、Objective-C语言所支持的数据类型,同时还增加了如元组、可空类型(optional type,请注意此类型是新增加类型,对于编写安全的代码具有很重要的作用)。另外swift是一种强类型的语言,意味着对类型检查的机制更加严格——swift不允许隐式类型转换。

一、常量和变量

1.1 声明常量和变量

// 以let关键字声明的标识符为常量
let maximumNumberOfLoginAttempts = 10

// 以var关键字声明的标识符为变量
var currentLoginAttempt = 0

// 可以在一行声明多个变量或常量
var x = 0.0 , y = 0.0 , z = 0.0

1.2 显式类型声明

  在1.1小节中,对于声明的变量或者常量,我们并没有去明确支持该标识符所属的数据类型,swift编译器会根据字面值自动推断出变量或常量的数据类型。
  在隐式类型推断过程中1、3、344等数字会被推断为Int类型,小数被推断为Double类型。
  除了使用编译器提供的类型推断功能外,还可以采用显式的声明机制,明确支持标识符所具有的数据类型。

// 在标识符后面紧跟冒号,冒号后有个空格,空格后是数据类型名
// 以上对于空格以及冒号的位置的说明是推荐做法
var welcomeMessage: String

// 可以在一行中声明多个标识符并制定数据类型
//  red , green , blue这三个变量都是Double类型
var red , green , blue : Double

1.3 常量与变量的命名

  常量与变量命名可以支持几乎所有的Unicode字符串,除空格、数学符号、箭头等。

// 个人建议命名时还是以英文字母、数字、_组成
let π = 3.14159
 let 你好 = "你好世界"
 let 🐶🐮 = "dogcow"

1.4 输出变量与常量

  在Objective-C中采用NSLog函数输出内容,在swift中与之类似的函数式print。

var welcomeMessage : String
welcomeMessage = "stest"
// print方法的声明是:print(_:separator:terminator:),其中后两个参数都有默认值
print (welcomeMessage)

1.5 注释

  在swift中支持两种格式的注释。


// 单行注释
var con1 = "单行注释"

var con2 = "单行注释也可以位于语句的右侧" // 单行注释也可以位于语句的右侧

/*
/*
请注意,多行注释可以嵌套了!
*/
*/
var con3 = "请注意,多行注释可以嵌套了!"

1.6 行结束符(分号)

  在C、C++、Objective-C语言中,分号作为行结束符是必须的,但是在swift中不是必须的。

// 一行中有多条语句时,语句之间需要使用分号
// 最后一条语句可以不用写分号
let cat = "🐱" ; print ( cat )

二、数据类型

2.1 整数

  请注意,在swift中整数、浮点数等都是对象!
  请注意,在swift中整数、浮点数等都是对象!
  请注意,在swift中整数、浮点数等都是对象!
  重要的事情说三遍!

let minValue = UInt8.min  // minValue is equal to 0, and is of type UInt8
let maxValue = UInt8.max  // maxValue is equal to 255, and is of type UInt8

// 对于整数1后面也可以采用.语法来访问其属性
print (1.description)

2.2 浮点数

Double的精度至少为15位十进制数,而Float的精度可以小至6位十进制数。 要使用的适当浮点类型取决于您在代码中使用的值的性质和范围。 在任何一种类型都适合的情况下, Double是首选。

2.3 其他进制数字

 let decimalInteger = 17
 let binaryInteger = 0b10001       // 17 in binary notation
 let octalInteger = 0o21           // 17 in octal notation
 let hexadecimalInteger = 0x11     // 17 in hexadecimal notation

  十进制数还可以采用以下方式表示

  十六进制数还可以采用以下方式表示

  以下数字都是12.1875

let decimalDouble = 12.1875
let exponentDouble = 1.21875e1
let hexadecimalDouble = 0xC.3p0

  数字前面可以补0以提高可读性,或者添加下划线。

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

2.4 类型别名

  在大多数语言中使用typedef来为类型定义别名,在swift中使用typealias来定义别名。

typealias AudioSample = UInt16
var maxAmplitudeFound = AudioSample.min
 // maxAmplitudeFound is now 0

2.5 布尔

// swift提供Bool数据类型
let orangesAreOrange = true
let turnipsAreDelicious = false

// 如下代码,在其他如C语言中可以通过编译;
// 但是在swift中不行,这就是其类型安全的一部分——不会自动进行隐式类型转换
let i = 1
 if i {
    // this example will not compile, and will report an error
}

以下所讲内容相对于C、C++、Objective-C来说是新增的,所以单独出来进行说明。

三、元组

  在一定程度上swift的元组类似于C、C++、Objective-C中的结构体——提供了一种简单的组合多个元素为一个整体的功能。

// http404Error即是一个元组,该元组的类型是(Int,String)
let http404Error = ( 404 , "Not Found" )

// 可以通过下标访问元组的元素
http404Error.0 // 404
http404Error.1 // "Not Found"

// 可以为元组的元素指定名称
let http400Error = ( index: 400 , resean: "Not Found" )

// 可以为元素名称访问元组的元素
http400Error.index
http400Error.resean

let ( statusCode , statusMessage ) = http404Error
print ( "The status code is  \ ( statusCode ) " ) // 输出404
print ( "The status message is  \ ( statusMessage ) " ) // 输出Not Found

//如果只想获得元组的部分值时,可以把其他值使用下划线忽略掉
 let ( justTheStatusCode , _ ) = http404Error
 print ( "The status code is  \ ( justTheStatusCode ) " ) // 输出404

// 元组可以作为从函数返回多个值得一种方法
func testTuples(age: Int, name: String) ->(String, String){
    return ("\(name)", "is \(age) years old")
}
print(testTuples(age: 2, name: "wwj"))

元组对临时的相关值组很有用。 它们不适合创建复杂的数据结构。 如果您的数据结构可能超出临时范围,则将其建模为类或结构,而不是作为元组。

四、可空类型

  可空类型的概念在C或Objective-C中不存在。 Objective-C中最接近的是从一个方法返回nil的能力,否则返回一个对象, nil意味着“没有有效的对象。”但是,这仅适用于对象 - 它不适用于结构、基本C类型或枚举值。 对于这些类型,Objective-C方法通常返回一个特殊值(例如NSNotFound )来指示缺少值。 这种方法假定方法的调用者知道有一个特殊的值来测试并记得检查它。 Swift的可空类型让你可以指出任何类型都没有值,而不需要特殊的常量。您可以在可能缺少有效值的情况下使用可空类型 。可空类型表示两种可能性:要么存在值,您可以打开可选项以访问该值,或者根本没有值。
  请仔细阅读并充分理解以上内容
  请仔细阅读并充分理解以上内容
  请仔细阅读并充分理解以上内容

//通过在类型后面添加?,标识该常量或变量是可控类型
// optType要么代表某字符串,要么是nil
// 此处由于没有味optType提供初始值,所以其值是nil
let optType: String? 

let possibleNumber = "123"
let convertedNumber = Int ( possibleNumber ) 
// 请注意此时convertedNumber的类型不是Int,而是Int?
// 因为Int ( possibleNumber ) 该语句会调用Int的返回可控类型的初始化方法,然后编译器根据返回值再确定convertedNumber的类型

Swift的nil与Objective-C中的nil 不同。 在Objective-C中, nil是指向不存在的对象的指针。 在Swift中, nil不是指针 - 它缺少某种类型的值。 任何类型的选项都可以设置为nil ,而不仅仅是对象类型。

// 假设convertedNumber是一个可空类型
// 以下示例代码展示了从可空类型获取其真实值得方法
 if convertedNumber != nil {
    // 此处已经可以断定该可空类型有值,所以可以在可控类型后面添加!来强制取出其值
    print ( "convertedNumber has an integer value of  \( convertedNumber ! ) ." )
}

请注意以上方法不是推荐方法
请注意以上方法不是推荐方法
请注意以上方法不是推荐方法


请注意以下方法是推荐方法
请注意以下方法是推荐方法
请注意以下方法是推荐方法

// 假设convertedNumber是一个可空类型
// 此示例也是if语句不需要布尔表达式的一个例子
 if let num = convertedNumber{
    print ( "convertedNumber has an integer value of  \(num) ." )
}

  另外的例子

if let firstNumber = Int ( "4" ), let secondNumber = Int ( "42" ), firstNumber < secondNumber && secondNumber < 100 {
    print ( " \ ( firstNumber )  <  \ ( secondNumber )  < 100" )
}
 // Prints "4 < 42 < 100"

 if let firstNumber = Int ( "4" ) {
    if let secondNumber = Int ( "42" ) {
        if firstNumber < secondNumber && secondNumber < 100 {
            print ( " \ ( firstNumber )  <  \ ( secondNumber )  < 100" )
        }
    }
}
 // Prints "4 < 42 < 100"

五、异常处理

  官方文档中说的是错误处理,个人理解叫作异常处理更加合适一些。

// 在方法后面添加throws关键字已标明该方法可能抛出异常
func canThrowAnError () throws {

}

// 与其他语言相比的try catch语法相比,这里有些微的差别
// 每个可能抛出异常的语句都需要在前面添加try关键字,这样能更加明确哪些函数会引发异常
do {
    try canThrowAnError ()
    // no error was thrown
} catch {
    // an error was thrown
}
// 抛出的异常需要符合Error协议
func makeASandwich() throws {
    // ...
}

do {
    try makeASandwich()
    eatASandwich()
} catch SandwichError.outOfCleanDishes {
    washDishes()
} catch SandwichError.missingIngredients(let ingredients) {
    buyGroceries(ingredients)
}
上一篇 下一篇

猜你喜欢

热点阅读