Swift基础学习(一)基本语法

by admin on 2020年3月17日

图片 1 

1、诞生

图片 2

Apple-swift-logo.png

Swift是Apple在WWDC2014所发布的一门编程语言,用来撰写OS
X和iOS应用程序。在设计Swift时,官方就有意和Objective-C共存,Objective-C是Apple操作系统在导入Swift前使用的编程语言。
Swift是供iOS和OS
X应用编程的新编程语言,基于CObjective-C,而却没有C的一些兼容约束。Swift采用了安全的编程模式,并通过添加新鲜的功能来使得编程更加简单、灵活和有趣。界面则基于广受人民群众爱戴的Cocoa和Cocoa
Touch框架,展示了软件开发的新方向。
2010 年 7 月LLVM
编译器的原作者暨苹果开发者工具部门总监克里斯·拉特纳(Chris Lattner –
Swift创始人)
开始着手 Swift 编程语言的工作,还有一个 dogfooding
团队大力参与其中。至2014年6月发表,Swift大约历经4年的开发期。苹果宣称Swift的特点是:快速、现代、安全、互动,且全面优于Objective-C语言。Xcode
Playgrounds功能是Swift为苹果开发工具带来的最大创新,该功能提供强大的互动效果,能让Swift源代码在撰写过程中能实时显示出其运行结果。拉特纳本人强调,Playgrounds很大程度是受到布雷特·维克多(Bret
Victor)理念的启发。
Go to check
details

 

Swift
是一门通用编程语言,使用现代方法构建安全性、性能和软件设计模式。它旨在成为各种编程项目的最佳语言
—— 从系统编程到桌面应用程序,以及云服务。下面将和大家简单介绍一下 Swift
以及如何在 Fedora 中使用它。

2、发展历史

2015年6月8日,苹果于WWDC2015上宣布,Swift将开放源代码,包括编译器和标准库。
2015年12月3日,苹果宣布开源Swift,并支持Linux,苹果在新网站Swift.org和托管网站Github上开源了Swift,但苹果的app
store并不支持开源的Swift,只支持苹果官方的swift版本,官方版本会在新网站Swift.org上定期与开源版本同步。

  Swift 简介(赞美一番,收集了多篇 关于Swift 学习教程的语言简介

  一直以为英语和汉语混写的时候只是英语字母结尾的地方打空格,原来是英语字母的开头和结尾都要加一个空格,英语字母后面是标点符号的时候不加空格):

  Swift 是一种新的编程语言,用于编写 iOS,macOS,watchOS 和 tvOS
的应用程序。Swift 结合了 C 和 Objective-C 的优点并且不受 C
兼容性的限制。Swift
采用安全的编程模式并添加了很多新特性,这将使编程更简单,更灵活,也更有趣。Swift
是基于成熟而且倍受喜爱的 Cocoa 和 Cocoa Touch
框架,它的降临将重新定义软件开发。

  Swift 的开发从很久之前就开始了。为了给 Swift
打好基础,苹果公司改进了编译器,调试器和框架结构。我们使用自动引用计数(Automatic
Reference Counting, ARC)来简化内存管理。我们在 Foundation 和 Cocoa
的基础上构建框架栈使其完全现代化和标准化。 Objective-C
本身支持块、集合语法和模块,所以框架可以轻松支持现代编程语言技术。正是得益于这些基础工作,我们现在才能发布这样一个用于未来苹果软件开发的新语言。

  Objective-C 开发者对 Swift 并不会感到陌生。它采用了 Objective-C
的命名参数以及动态对象模型,可以无缝对接到现有的 Cocoa
框架,并且可以兼容 Objective-C 代码。在此基础之上,Swift
还有许多新特性并且支持过程式编程和面向对象编程。

  Swift
对于初学者来说也很友好。它是第一个既满足工业标准又像脚本语言一样充满表现力和趣味的系统编程语言。它支持代码预览(playgrounds),这个革命性的特性可以允许程序员在不编译和运行应用程序的前提下运行
Swift 代码并实时查看结果。Playground
会随着我们编写代码实时为我们完成编译,并自动为我们显示每一行代码的执行结果,无论是简单语句,循环,甚至是各种UI,Playground
都可以完美胜任,是我们理解 Swift
中各种语言特性的利器。我们的学习过程的编码基本都在 playgrounds
下进行,大大提高的我们学习的效率,所写即所见。

  Swift
将现代编程语言的精华和苹果工程师文化的智慧结合了起来。编译器对性能进行了优化,编程语言对开发进行了优化,两者互不干扰,鱼与熊掌兼得。Swift
既可以用于开发 “hello, world”
这样的小程序,也可以用于开发一套完整的操作系统。所有的这些特性让 Swift
对于开发者和苹果来说都是一项值得的投资。

  Swift 是编写 iOS,macOS,watchOS 和 tvOS
应用的极佳手段,并将伴随着新的特性和功能持续演进。

  Swift 提供了 C 和 Objective-C 的所有基础数据类型,包含整数
Int,浮点数 Double、Float,布尔值 Bool 以及 String 字符串(String
类型已经不再是字符数组,在 Swift 里面 String 不是集合类型,在 Swift
里面字符串做了很大的优化)。同时 Swift
也提供了两种强大的集合数据类型,包括
Array(数组)和Dictionary(字典)。除了熟悉的类型,Swift 介绍了
Objective-C
中无法实现的高级类型。这些包括元组,从而能够创建和传递值分组。元组可以从一个函数作为一个单一的复合值返回多个值。

  和 C 一样,Swift
使用变量来储存和访问数值。Swift也支持数值不能改变的变量,这在C中我们称为常量,但在
Swift
中常量将会更加强大。当变量值不需要改变的时候,可以使用常量,这会使得代码更加安全和简洁。

  另外,Swift引入了在Objective-C中没有的一些高级数据类型,例如tuples(元组),可以使你创建和传递一组数值。

  Swift
还引入了可选项类型(Optionals),用于处理变量值不存在的情况。可选项的意思有两种:一是变量是存在的,例如等于
X,二是变量值根本不存在。Optionals 类似于 Objective-C 中指向 nil
的指针,但是适用于所有的数据类型,而非仅仅局限于类,Optionals 相比于
Objective-C 中 nil 指针更加安全和简明,并且也是 Swift
诸多最强大功能的核心。

  Swift 是一门类型安全的语言,Optionals 就是代表。Swift
能帮助你在类型安全的环境下工作,如果你的代码中需要使用 String
类型,Swift 的安全机制能阻止你错误的将 Int
值传递过来,这使你在开发阶段就能及时发现并修正问题。

 

安全,快速,富有表现力

和许多现代编程语言一样,Swift 旨在设计得比基于 C
的编程语言更安全。例如,变量总是在可以使用之前初始化、检查数组和整数是否存在溢出、内存自动管理等。

Swift 将意图放在语法中。要声明变量,使用 var 关键字;要声明常量,请使用
let。

Swift
还保证对象永远不会是空指针(nil);实际上,尝试使用已知为空指针的对象将会导致出现编译时错误(compile-time
error)。当可以使用一个 nil
值时,它支持一种被称为 optionals 的机制。其中一个可选项包括空指针,但通过使用 ? 操作符可以安全地解包。

一些额外的特性包括:

  • 闭包与函数指针统一

  • 元组和多个返回值

  • 泛型

  • 对范围或集合(range or collection)进行快速而简洁的迭代

  • 支持方法,扩展和协议的结构

  • 函数式编程模式,例如映射和过滤(map and filter)

  • 内置强大的错误处理功能

  • 使用 do,guard,defer 和 repeat 关键字编写高级控制流程

3、特点

  • Swift取消了OC的指针及其他不安全访问的使用,并舍弃OC早期套用Smalltalk的语法,全面改为句点表示法(dot-notation)。同许多脚本语言一样,Swift可以推断变量类型(类型推导,var,
    variant
    )。同时,它提供了类似C++C#的命名空间(namespace)、泛型(generic)、运算对象重载(operator
    overloading
    )。Swift被简单的形容为 “没有COC”。

  • 类型与变量
    Cocoa( Mac OS X的开发环境 )与Cocoa Touch( iPhone
    OS的开发环境

    )的环境下,许多共用的类都放在FoundationKit库下,这些类别包含了NSString
    字符串库(使用 Unicode),还有集合类别 NSArray
    NSDictionary。OC 提供了语法糖(syntactic
    sugar)的方式让这些对象可以集成在同一个语言里。例如NSString之间合并的表示法如下:

NSString *str = @"what a,"; str = [str stringByAppendingString:@"nice day"];

Swift里,
字符串的合并可以用加法(+)运算对象作为第一优先级对象(First-class
citizen)的方式直接完成, 上述的例子可以简化为:

var str = "what a,"
 str += " nice day"

过去Cocoa(以及Cocoa Touch)的架构总是被分成两种版本:

  • 可变的(mutable),也就是可以在运行时期(runtime)改变
  • 不可变的(immutable),其初始值不可改变。
    例如 NSArray 与 NSMutableArray 就是数组的两种版本。

Swift语言里仍延续这个传统,但更简化。

  • 使用let 关键字去设置常量constant variable
  • Mutable对象则使用 var 关键字

Swift语言使用类似C#Javascriptvar定义变量,但特性又不尽相同:

  • Swift不会直接指派初始值给变量,即变量不会有默认值,所以使用var变量之前必须先初始化,不然会发生编译时期的错误。

  • 为了方便使用,Swift还提供Optional的定义来宣告nil-free
    references
    。宣告Optional只需要在类型后面加上问号(?)即可。一旦var变量宣告为Optional的,其初始值就会被默认为nil。Optional本质上是enum,有定义NoneSome两种类型,nil即是Optional.None

  • 库、运行时期与部署
    SwiftMac OSiOS 平台可以和 Objective-C
    使用相同的运行时期(runtime)。这意味着Swift程序可以运行于目前已存在的平台之上,包含
    iOS6以上 和 OS X 10.8以上
    都可以运行Swift的程序,SwiftObjective-C的代码可并存于单一程序内,
    这种延伸就如同 CC++ 的关系一样。
    为了争取大量的开发人员并重复使用已存在的代码,Xcode 6 允许在
    app target 导入 Objective-C 文件供给 Swift 使用,通过
    Objective-C 的桥接头文件(bridging header)来暴露给
    Swift。当开发人员添加 Swift 文件到现有的 Objective-C
    应用程序时,Xcode 会自动创建这些头文件。例如,一个 Swift
    知名的类别 “TestClass” 可用于 Objective-C 的方式 #import
    “TestClass.h”

  • 存储器管理
    Swift全面使用自动引用计数(ARC)来管理存储器,替换过去Objective-C的垃圾回收机制。过去在Objective-C中,强引用(strong
    reference
    )即为非ARC中的retain,而弱引用(weak
    reference
    )即为非ARC中的assign。为了解决循环引用的问题,Swift提供unowned,不能设定为optional
    types
    ,不能加上问号(?)或惊叹号(!

  • 除错以及其他元素
    Xcode的除错机制针对Swift语言提供REPL(Read-Eval-Print
    Loop)
    环境,可以利用Swift语法来评估或与其他程序交互,使Swift编程具有类似Python与Ruby交互性接口(Interactive
    Shell

  • 类似Objective-C的地方

  • 基本数值类型(numeric types)大致相同 (例如Int, UInt,
    Float, Double)

  • 大量的C运算对象被移出Swift, 但又引入一些新运算对象

  • 大括号被用于组群陈述(group statements)

  • 变量的赋值使用等于符号,
    但比较则使用(==)运算对象,还有一个新的运算对象,(===)被用来判断常数或变量之间是否为同一对象的实例

  • 中括号([])用于数组的表示,
    可以根据索引值(index)来进行元素(element)的访问

  • 控制陈述, for, while, if, switch
    Ojbective-C都十分类似, 但有延伸功能, 比如 for in
    用于集合的轮询,switch 还可以接受非整数的cases条件值,
    诸如此类

  • 不同于Objective-C之处

  • 陈述句不须再使用分号(;)做为结束,但分号还是可以在一行以内作为两行不同代码的分隔

  • 头文件(Header files)不再需要

  • 强类型(strong type

  • 类型推导

  • 支持泛型编程

  • 函数为第一级类型,这意味着函数可以作为其他函数的参数与返回值

  • 运算对象可在类别内重新定义 (运算对象重载),可以生成新的运算对象

  • 字符串全方面支持
    Unicode,某些字符甚至可以成为语言的名称

  • 许多C语言过去的语法也被改变:

    • 不再存在指针)
    • Assignments不再回传值,正确写法是 if (i==0)
      ,一般容易误写成** if (i=0) **会造成编译时期错误
    • switch的区块内不需要再使用break叙述句。另外,case后面都需要有可执行的代码(C或C++可连续使用多个case而不需要额外的代码),否则会发生编译错误
    • 变量和常数都要被初始化,而且数组的界限也要确认清楚
    • 溢出(overflows)的问题。C语言没有强制整数类型(signed
      integers)的界限,常常在运行时间发生问题。Swift可以通过整数类型的maxmin属性获取最大值或最小值

  Hello, world!

  在屏幕上打印”Hello, world!”,在 Swift 里面可以用一行代码实现:

1  print("Hello, world!")

1 NSLog("Hello, world!")

  写过 C 和 OC 代码的打印”Hello, world!”,对这种形式应该特别熟悉,在
Swift
中,这行代码就是一个完整的程序。不需要为了输入输出或者字符串处理导入一个单独的库,全局作用域中的代码会被自动当做程序的入口点,所以也不需要 main()函数。

 

在 Fedora 中试用 Swift

现已支持在 Fedora 28 中使用
Swift,不过需要安装名为 swift-lang 的软件包。安装完成后,运行 swift
命令并启动 REPL 控制台。

$ swift
Welcome to Swift version 4.2 (swift-4.2-RELEASE). Type :help for assistance.
  1> let greeting="Hello world!"
greeting: String = "Hello world!"
  2> print(greeting)
Hello world!
  3> greeting = "Hello universe!"
error: repl.swift:3:10: error: cannot assign to value: 'greeting' is a 'let' constant
greeting = "Hello universe!"
~~~~~~~~ ^
  3>

Swift
拥有一个不断发展的社区,特别是一个致力于使其成为高效且有效的服务器端编程语言的工作组。建议访问其主页,了解更多参与方式。

来自:

(文/开源中国)    

4、示例程序

变量的宣告方式如下:

var smallMa = 120
var smallHe = 127.3
var smallYang: Double = 247.3

let 声明常量的方式如下:

let age = 22
let birthday = 1994
let cow = "I am a cow,I eat greens"
let milk = " (age + birthday) "

Swift不支持隐式类型转换,因此数与字符串之间要以显式类型转换:

let tom = "The weight of tom is "
let jerry = 250
let tableWidth = tom + String(jerry)

不能少的Hello World

print("Hello, world") 

可以使用Unicode字符,例如在文本内容有不同语言的文字时就可以放心添加,不必担心出现无法解读的乱码:

let 人 = ["王亮": 67, "李梅": 28, "盖伦": 33, "李青": 25]
for (name, age) in 人 {
    print("(name)是(age) 岁。")
}

** Playground **log:

图片 3

图片.png

  Swift:分号的使用

  swift
中每一行独立代码的末尾都不再需要加分号,如果是多个语句在同一行内书写时要用分号把它们隔开。

1 // 第一个语句是定义一个变量 Str,并赋初始值是"Hello, playground",后面是四个打印语句,中间用分号隔开(此时在最后一个 NSLog 后面加分号不加分号都可以)
2 var str = "Hello, playground"; print(str); print(str); NSLog(str); NSLog("xxx(str)")

 

5、参考资料

  • Swift
    学习指引
  • Swift
    编程语言)

  Swift:引入

  使用 import 语句来引入任何的 Objective-C 框架(或 C 库)到 Swift
程序中。例如 import cocoa 语句导入了使用了 Cocoa 库和
API,我们可以在 Swift 程序中使用他们。

  Cocoa 本身由 Objective-C 语言写成,Objective-C 又是 C
语言的严格超集,所以在 Swift 应用中我们可以很简单的混入 C
语言代码,甚至是 C++ 代码。

1 import UIKit // 引入UIKit 框架
2 import Foundation // 引入Foundation 框架
3 import ImageIO // 引入ImageIO 

 

  Swift:注释

  两个反斜杠开头是单行注释,OC 和 Swift 保持不变:

1 // 这是单行注释

  三个反斜杠是标记注释写法之一,OC 和 Swift 保持不变:

1 /// 标记注释

1     /// 测试标记注释
2     ///
3     /// - Parameter person: 人数
4     /// - Returns: HML
5     func test(person: Int) -> String {
6         print(person)
7         return "HML"
8     }

  标记注释用法如下:

图片 4

  另外一种标记注释的写法是,以/** 开头以*/
结尾,中间包裹标记注释的内容,标记注释多用来标记函数的用途,以及属性的所代表的含义。

1 /**
2  标记注释的内容
3  */

  多行注释以 /* 开头以 */ 结尾,中间包裹注释的内容:

1 /*
2  这是一个多行注释
3  */

  与 OC 不同的是,Swift 可以在多行注释里面嵌套其它多行注释,OC
是直接报错的。写法是在一个多行注释块内插入另一个多行注释,第二个注释块封闭时,后面仍然接着第一个注释块。

1         /*
2          第一个多行注释开头
3          /*
4          第二个多行注释在里面嵌套
5          */
6          第二个多行注释结尾
7          */

 

  Swift:标识符

  和其它语言一样,标识符就是给变量、常量、方法、函数、枚举、结构体、类、协议、闭包等命名的名字,构成标识符的字符串有一定的规则,在Swift
里面规则如下:

  1.字母区分大小写,如 “str” 和 “Str” 是两个不同的标识符。

  2.标识符的首个字符可以是字母或者下划线,且只能以字母或者下划线开头。

  3.标识符里面只能有字母、数字、下划线组成,不能包含符号,如”~!@#$%^&*()…”
都不能出现

  注意: Swift 里面的字符都是采用的Unicode 编码,Unicode
叫做统一编码制,它包含了亚洲文字编码,如中文、日文、韩文等字符,还包含emoji
表情,所以变量我们甚至可以用汉字和emoji
表情来命名。如果一定要使用关键字作为标识符,可以在关键字前后添加重音符号(’)。

1 var 汉字 = "HML"
2 print("(汉字)")
3 
4 var 👨‍👩‍👧‍👧 = "family"
5 print("(👨‍👩‍👧‍👧)")

 

  Swift:关键字  

  关键字是类似于标识符命名规则的系统保留的字符序列,即关键字是对编译器具有特殊意义的预定义保留标识符。

  例如:

  与声明有关的关键字:class、func、let、public、typealias、deinit、import、operator、static、var、enum、init、private、struct、extension、internal、protocol、subscript

  与语句有关的关键字:break、do、if、where、case、else、in、while、continue、fallthrough、return、default、for、switch

  表达式和类型关键字:as、nil、true、_LINE_、dynamicType、self、_COLUMN_、false、Self、_FILE_、is、super、_FUNCTION_

  在特定上下文中使用的关键字:associativity、final、lazy、nonmutating、precedence、right、weak、convenience、get、left、optional、prefix、set、willSet、dynamic、infix、mutating、override、Protocol、Type、didSet、inout、none、postfix、required、unowned

 

  Swift:空格

  Swift 对空格的使用有一定的要求。

  1.运算符不能直接跟在变量或者常量的后面。

  a 与 = 连在一起的时候:

图片 5

   1 与 + 连在一起的时候:

图片 6

  提示让在加号后面插入一个分隔符,这是因为Swift 以为1+
这个语句结束了,而 2 是下一个语句,所以中间要插入一个分隔符号。

1 let b = 1 + 2 // 这是规范推荐使用的写法
2 let c = 3+4 // 这样也是可以的

  

  Swift:字面量

   字面量,就是指特定的数字、字符串或者布尔值这样,能够直接了当的指出自己的类型并为变量进行赋值的值。

1 42 // 整形字面量
2 3.1415926 // 浮点型字面量
3 "Hello, worle!" // 字符串字面量
4 true // 布尔型字面量

 

  好了,基本语法先写这么多,后面用到的时候再一步一步的详细学习。

 

参考链接:

 

END 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图