swift学习笔记(一)

“Swift is a powerful and intuitive programming language for macOS,
iOS, watchOS and tvOS. Writing Swift code is interactive and fun, the syntax is concise yet expressive, and Swift includes modern features developers love. Swift code is safe by design, yet also produces software that runs lightning-fast.” --苹果官方

苹果自2014年WWDC大会推出swift,到现在越来越多的项目开始使用swift进行开发,所以必须得上车啦!!!


上车啦.jpeg

hello, swift !

print("Hello, world !")

不能坏了规矩不是!哈哈... 如上,就是swift版的“Hello,world !”。注意,末尾没有分号!swift语言不要求在每句代码的后面加分号。当然,你也可以写上。但如果多句代码写在一行,每句代码之间要用分号分割

print("Hello, world !");print("Hello, swift")

把上面两个print语句之间的分号去掉,会提示如下错误:

Consecutive statements on a line must be separated by ';'

常量和变量
声明常量使用关键字let,声明变量使用关键字var。常量值不可被改变,变量值则可以修改。

let constant = 10  // 常量
var variable = 12  // 变量

类型推断
swift是类型安全的。不管是常量还是变量,必须要有一个确定的类型。如果在声明常量或亦是时进行了初始化,编译器能自动推断出该变量或常量的类型。如果没有初始化,这时需要显式的给常量或变量指明一个类型。

var myVariable = 42  // 编译器根据初始值42自动推断出myVariable是Int型
let implicitDouble = 70.0 // 编译器根据初始值70.0推断出implicitDouble为float型
let explicitDouble: Double = 70 // 可显式指定explicitDouble为Double型
var score: Double // 也可以只声明,不初始化

类型转换

let label = "The width is "
let width = 94
let widthLabel = label + String(width)

这里String(width)相当于创建了一个String的实例。+则用于将两个字符串拼接起来。

使用符号\()(反斜杠后面跟一括号)也能达到类型转换的目的。

let apples = 3
let oranges = 5
let appleSummary = "I have \(apples) apples."
let fruitSummary = "I have \(apples + oranges) pieces of fruit.

三个双引号
当字符串内容较多时,可以分多行来写,这时可使用三个双引号"""括起来。

let quotation = """
Even though there's whitespace to the left,
the actual lines aren't indented.
Except for this line.
Double quotes (") can appear without being escaped.
I still have \(apples + oranges) pieces of fruit.
"""

集合(数组和字典)

/// 声明一个数组变量
var shoppingList = ["catfish", "water", "tulips", "blue paint"]
// 通过索引更改数组的值
shoppingList[1] = "bottle of water"

 /// 声明一个字典变量
var occupations = [
    "Malcolm": "Captain",
    "Kaylee": "Mechanic",
]
// 新增键值对
occupations["Jayne"] = "Public Relations"

声明空数组和空字典

let emptyArray = [String]()
let emptyDictionary = [String: Float]()

如果数组或字典的类型已知,可以这样写一个空数组或字典

shoppingList = []
occupations = [:]

流程控制
使用ifswitch进行条件分支的判断,使用whilefor-inrepeat-while书写循环语句。

let individualScores = [75, 43, 103, 87, 12]
var teamScore = 0
for score in individualScores {
    if score > 50 {
        teamScore += 3
    } else {
        teamScore += 1
    }
}
print(teamScore)

注意,if的条件必须是布尔值,像下面这样就是错的

let score = 60
if score { print("oh yeah !") } // 报错:'Int' is not convertible to 'Bool'

使用if-let语句处理可选值

var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
    greeting = "Hello, \(name)"
}
else {
    print("opitionalName is nil")
}

由于变量opitionalName有初始值,所以程序会走到if的第一个分支语句里面去。如果opitionalName是nil,才会走到else语句中去。

??
使用符号??处理可选

let nickName: String? = nil
let fullName: String = "John Appleseed"
let informalGreeting = "Hi, \(nickName ?? fullName)"
print(informalGreeting) // Hi, John Appleseed

fullName这里相当于默认值

switch

let vegetable = "red pepper"
switch vegetable {
case "celery":
    print("Add some raisins and make ants on a log.")
case "cucumber", "watercress":
    print("That would make a good tea sandwich.")
case let x where x.hasSuffix("pepper"):
    print("Is it a spicy \(x)?")
default:
    print("Everything tastes good in soup.")
}

Dictionary

let interestingNumbers = [
    "Prime": [2, 3, 5, 7, 11, 13],
    "Fibonacci": [1, 1, 2, 3, 5, 8],
    "Square": [1, 4, 9, 16, 25],
]
var largest = 0
for (kind, numbers) in interestingNumbers {
    for number in numbers {
        if number > largest {
            largest = number
        }
    }
}
print(largest)

while && repeat-while

var n = 2
while n < 100 {
    n *= 2
}
print(n)
 
var m = 2
repeat {
    m *= 2
} while m < 100
print(m)

range
..<不包含右边区域最大值;...包含右边区域最大值。

var total = 0
for i in 0..<4 {
    total += i
}
print(total) // 6

var total = 0
for i in 0..<4 {
    total += i
}
print(total) // 10

函数和闭包
函数以func开头,->用于分割参数和返回值类型。

func greet(person: String, day: String) -> String {
    return "Hello \(person), today is \(day)."
}
greet(person: "Bob", day: "Tuesday")

函数调用时默认显示变量名。
函数变量名前加_,调用时不显示参数名称;若变量名前加参数名称,调用时显示添加的参数名称。

func greet(_ person: String, on day: String) -> String {
    return "Hello \(person), today is \(day)."
}
greet("John", on: "Wednesday")

函数嵌套

func returnFifteen() -> Int {
    var y = 10
    func add() {
        y += 5
    }
    add()
    return y
}
returnFifteen()

函数做为返回值

func makeIncrementer() -> ((Int) -> Int) {
    func addOne(number: Int) -> Int {
        return 1 + number
    }
    return addOne
}
var increment = makeIncrementer()
increment(7)

函数做为参数

func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool {
    for item in list {
        if condition(item) {
            return true
        }
    }
    return false
}
func lessThanTen(number: Int) -> Bool {
    return number < 10
}
var numbers = [20, 19, 7, 12]
hasAnyMatches(list: numbers, condition: lessThanTen)

closure(闭包)
关于闭包,先来看看官方是怎么说的:

Closures are self-contained blocks of functionality that can be passed 
around and used in your code. Closures in Swift are similar to blocks 
in C and Objective-C and to lambdas in other programming languages.

解释一下:闭包就是一个代码块,类似于C和Objective-C中的block。
下面上个简单的栗子:

numbers.map({ (number: Int) -> Int in
    let result = 3 * number
    return result
})

示例中({})内的代码就是一个简单的闭包!

注释

// 这是一行注释

/*
我是多行注释
我是多行注释
*/

/*
多行注释可以嵌套
/*我是嵌套注释*/
/*我是嵌套注释*/
多行注释可以嵌套
*/

类和对象
创建一个Shape类

class Shape {
    var numberOfSides = 0
    func simpleDescription() -> String {
        return "A shape with \(numberOfSides) sides."
    }
}

创建一个Shape类的实例

var shape = Shape()
shape.numberOfSides = 7
var shapeDescription = shape.simpleDescription()

Enumerations 枚举
使用enum创建一个枚举,枚举里面可以定义方法

enum Rank: Int {
    case ace = 1
    case two, three, four, five, six, seven, eight, nine, ten
    case jack, queen, king
    func simpleDescription() -> String {
        switch self {
        case .ace:
            return "ace"
        case .jack:
            return "jack"
        case .queen:
            return "queen"
        case .king:
            return "king"
        default:
            return String(self.rawValue)
        }
    }
}
let ace = Rank.ace
let aceRawValue = ace.rawValue

Structures 结构体
创建一个结构体Card

struct Card {
    var rank: Rank
    var suit: Suit
    func simpleDescription() -> String {
        return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
    }
}
let threeOfSpades = Card(rank: .three, suit: .spades)
let threeOfSpadesDescription = threeOfSpades.simpleDescription()

由于我是基于苹果的 "The Swift Programing Language(Swift 4)" 文档来学习的,这里也按文档的开始部分来个概述,后面再一一详细展开。有不对的地方,欢迎拍砖!

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

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,132评论 0 13
  • 一直没有时间好好看一下swift,最近复习了一遍语法,这里记录swift学习过程中遇到的一些问题和要点,和Obje...
    bomo阅读 2,339评论 0 25
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,784评论 1 10
  • 2014年的苹果全球开发者大会(WWDC),当Craig Federighi向全世界宣布“We have new ...
    yeshenlong520阅读 2,275评论 0 9
  • 第一次见到暑前枸杞是在父母的家中,那天周末我和老公回父母家吃饭,一进屋看到父亲正在厨房忙碌,而母亲则在电视机前看着...
    枸杞行业评论员阅读 281评论 0 1