Swift3.0学习笔记(一)

Swift 3.0学习笔记(一)

开始

对于英语比较好的读者,可以直接阅读苹果官方的文档。链接

编译环境

swift的专门的编译工具是Xcode,Xcode现在已经更新到了8.0版本。不够,Xcode只能在苹果的MacOS系统下安装运行。在今年的WWDC大会上,苹果为大多数没有苹果笔记本的开发者带来了福音,苹果在推出swift2.3的同时,宣布Xcode能在Linux的环境下安装运行。
Linux环境下的安装方式:

$ sudo apt-get install clang 
$ export PATH=/path/to/Swift/usr/bin:"${PATH}" //添加环境变量

REPL编译运行swift

REPL即交互式编译环境。我们在安装了Xcode后,可以使用终端来编译运行简单的swift代码。

$ swift --version
Apple Swift version 3.0 (swiftlang-800.0.46.2 clang-800.0.38)
Target: x86_64-apple-macosx10.9 

从我终端使用命令运行后的结果可以知道,我现在的swift已经到了3.0版本。
使用REPL能够让初学者体验swift的编程过程。

> 1 + 2
$RO: Int = 3

上面的代码中,实现了简单的运算。运行的结果出现了Int关键字,它是一种数据类型。需要注意的是在swift中,数据类型的首字母需要大写,这一点与其他的编程语言有所不同。

> let greeting="Hello"
> print(greeting)
Hello

上面的代码中,我们使用let关键字定义了一个常量。不过,这里我们并有声明常量的数据类型,这就体现了swift的强大之处,即类型推断。所谓的类型推断就是我们在定义常量,变量的时候可以不用声明数据的类型,它会帮我们自动进行推断。

REPL还有一个强大之处就是函数和方法的显示。

5>“Hi”.re   
Available completions:
remove(at: String.Index) -> Character
removeAll() -> Void
removeAll(keepingCapacity: Bool) -> Void
removeSubrange(bounds: ClosedRange<String.Index>) -> Void
removeSubrange(bounds: Range<String.Index>) -> Void
replaceSubrange(bounds: ClosedRange<String.Index>, with: C) -> Void
replaceSubrange(bounds: ClosedRange<String.Index>, with: String) -> Void
replaceSubrange(bounds: Range<String.Index>, with: C) -> Void
replaceSubrange(bounds: Range<String.Index>, with: String) -> Void
reserveCapacity(n: Int) -> Void
 
 6> "Hi".re

在上面的代码中,在字符串Hi后输入了方法的前两个字母re,然后点击Tab键就会将与之相关的方法打印出来。
REPL是相当智能的,当我们的代码中需要用到像循环这样的代码块时使用大括号{}可以实现自动换行。并且在代码中,循环语句是从>.符号结束的部分。

    10>  let number=[1,2,3]
 number: [Int] = 3 values {
  [0] = 1
  [1] = 2
  [2] = 3
 }
 11> for n in numbers.reversed(){ 
 12.  print(n)
 13. } 

REPL导入包

 14> import Darwin
 15> arc4random_uniform(10) //随机生成一个10以内的数
$R1: UInt32 = 0
 16> arc4random_uniform(10) //随机生成一个10以内的数 
$R2: UInt32 = 6

使用包管理器

    $ swift package --help 
    OVERVIEW: Perform operations on Swift packages
    ......

该命令可以查看包的帮助信息。

创建包

$ mkdir hello //创建名为hello的文件目录
$ cd hello //定位到创建的目录下

因为每个包都需要有一个名为Package.swift的配置文件,所以我们需要使用init命令对包进行初始化。

$ swift package init

被初始化后的包增加了Package.swift配置文件,Sources和Tests两个目录。Sources目录下有一个Hello.wift文件;Tests目录下有一个LinuxMain.swift文件和HelloTests目录,该目录下有一个HelloTests.swift文件。

编译包

$ swift build
Compile Swift Module 'Hello' (1 sources)

运行包

$ swift test 
Compile Swift Module 'helloTests' (1 sources)
Linking ./.build/debug/helloPackageTests.xctest/Contents/MacOS/helloPackageTests
Test Suite 'All tests' started at 2016-09-17 00:24:44.838
Test Suite 'helloPackageTests.xctest' started at 2016-09-17 00:24:44.841
Test Suite 'helloTests' started at 2016-09-17 00:24:44.841
Test Case '-[helloTests.helloTests testExample]' started.
Test Case '-[helloTests.helloTests testExample]' passed (0.005 seconds).
Test Suite 'helloTests' passed at 2016-09-17 00:24:44.847.
     Executed 1 test, with 0 failures (0 unexpected) in 0.005 (0.005) seconds
Test Suite 'helloPackageTests.xctest' passed at 2016-09-17 00:24:44.847.
     Executed 1 test, with 0 failures (0 unexpected) in 0.005 (0.006) seconds
Test Suite 'All tests' passed at 2016-09-17 00:24:44.847.
     Executed 1 test, with 0 failures (0 unexpected) in 0.005 (0.009) seconds

编译成一个可执行的包

当包里面包含main.swift文件时,这个包就是可执行的。包文件管理器将编译这个文件为二进制的可执行文件。

$ mkdir Hello 
$ cd Hello 
$ swift package init --type executable 
$ swift build 
$ .build/debug/Hello
Hello,World!

在上面的命令运行完之后,我们发现Tests目录下是空的,这就是上面的创建的包的不同。 另外,在Sources目录下生成的文件不再是hello.swift而换成了main.swift 。

使用LLDB调试器

func factorial(n: Int) -> Int {
    if n <= 1 { return n }
    return n * factorial(n: n - 1)
}
let number = 4
print("\(number)! is equal to \(factorial(n: number))")

使用上面的代码创建名为Factorial.swift的文件。使用一下命令行编译代码:

$ swiftc -g Factorial.java
$ ls 
Factorial.dSYM
Factorial.swift
Factorial

swiftc 命令后加g参数生成一个调试信息,同时在当前目录下生成一个名为Factorial的可执行文件。

    $ lldb Fatorial
     (lldb) target create "Factorial"
    Current executable set to 'Factorial' (x86_64).
    (lldb) b 2 
    (lldb) r
    (lldb) p n
    (lldb) c
    (lldb) br di 

b 2:在第二行设置断点(breakpoint);
r:运行(run)程序;
p n:输出(print)参数n的值;
c:继续(continue)运行;
br di:断点(breakpoint)取消(disable);

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

推荐阅读更多精彩内容