swift小笔记

1、一行中声明多个变量或常量,用逗号分隔

var x = 0.0, y = 0.0, z = 0.0

var red, green, blue: Double

2、推荐使用 Double 类型、Int类型。

3、Int(string)返回一个可选的 Int ,而不是 Int 。可选的 Int 写做 Int? ,而不是 Int 。问号明确了它储存的值是一个可选项,意思就是说它可能包含某些 Int 值,或者可能根本不包含值。(他不能包含其他的值,例如 Bool 值或者 String 值。它要么是 Int 要么什么都没有。)

let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
// convertedNumber is inferred to be of type "Int?", or "optional Int"

4、通过给可选变量赋值一个 nil 来将之设置为没有值,在函数参数使用时可以把参数定义为可选项,然后给默认值为nil,来在调用时省略参数

var serverResponseCode: Int? = 404
// serverResponseCode contains an actual Int value of 404
serverResponseCode = nil
// serverResponseCode now contains no value

    func requestData(_ itemIds:[String]? = nil, _ month:Int? = nil, _ year:Int? = nil, _ state:Int? = nil) {
   ////////
    }

调用 requestData()

5、善用 if let 、guard let 可选绑定的关键字

guard let constantName = optionalValue else {
    // optionalValue 不包含值的情况,提前返回或处理错误。
    // 必须在此处退出当前函数、循环或代码块
}
// 在此处使用 constantName,它是一个非可选的值


let optionalName: String? = "Alice"
if let name = optionalName {
    print("Hello, \(name)!")  // 输出 "Hello, Alice!"
} else {
    print("The name is missing.")
}

6、通过检查布尔量 isEmpty属性来确认一个 String值是否为空

var emptyString = ""               // empty string literal
var anotherEmptyString = String()  

if emptyString.isEmpty {
    print("Nothing to see here")
}
// prints "Nothing to see here"

7、范型

函数使用

// 指明函数的泛型参数(形式参数)需要使用'T'这个类型(T自己定义的一个类型)
func swapTwoValues<T>(_ a: T, _ b: T)

除了泛型函数,Swift允许你定义自己的泛型类型。它们是可以用于任意类型的自定义类、结构体、枚举,和 Array 、 Dictionary 方式类似。

struct IntStack {
    var items = [Int]()
    mutating func push(_ item: Int) {
        items.append(item)
    }
    mutating func pop() -> Int {
        return items.removeLast()
    }
}

用泛型改写:
struct Stack<Element> {
    var items = [Element]()
    mutating func push(_ item: Element) {
        items.append(item)
    }
    mutating func pop() -> Element {
        return items.removeLast()
    }
}

使用实例
通过在尖括号中写出存储在栈里的类型,来创建一个新的 Stack 实例。例如,创建一个新的字符串栈,可以写 Stack<String>() :
var stackOfStrings = Stack<String>()
stackOfStrings.push("uno")
stackOfStrings.push("dos")
stackOfStrings.push("tres")
stackOfStrings.push("cuatro")
// the stack now contains 4 strings

8、循环 for-in 、forEach、(while、repeat-while 了解)

// 数组
let names = ["Anna", "Alex", "Brian", "Jack"]
for name in names {
    print("Hello, \(name)!")
}

🌟map 和 forEach 是 Swift 中用于处理序列(比如数组)的两个常见方法
map 转换每个元素并生成新的序列,而 forEach 只是对每个元素进行操作,不返回新序列(简单的来说就是map有返回值,forEach无返回值)。
🌟map 和 forEach使用如下:
============================================
let numbers = [1, 2, 3, 4, 5]
// 使用 map 转换每个元素,并返回一个新的序列
let multipliedByTwo = numbers.map { $0 * 2 }
print(multipliedByTwo) // 输出 [2, 4, 6, 8, 10]

// 使用 forEach 对每个元素执行操作
numbers.forEach { print($0) } // 输出 1 2 3 4 5

=============================================


// 字典
let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
for (animalName, legCount) in numberOfLegs {
    print("\(animalName)s have \(legCount) legs")
}

// 角标
for index in 1...5 {
    print("\(index) times 5 is \(index * 5)")
}

let minutes = 60
for tickMark in 0..<minutes {
    // render the tick mark each minute (60 times)
}

// stride 函数使用
let minuteInterval = 5
for tickMark in stride(from: 0, to: minutes, by: minuteInterval) {
    // render the tick mark every 5 minutes (0, 5, 10, 15 ... 45, 50, 55)
}
//闭区间也同样适用,使用 stride(from:through:by:) 即可

9、 .first(where: ...) 是一个用于在集合中查找满足指定条件的第一个元素的方法。它的使用方式如下:
便利的循环条件筛选 使用 is 来判断

eg:1
let numbers = [1, 2, 3, 4, 5]

if let firstEvenNumber = numbers.first(where: { $0 % 2 == 0 }) {
    print("The first even number is \(firstEvenNumber)")
} else {
    print("No even number found")
}


eg:2
 if let targetViewController = UINavigationController.jk_topNav().viewControllers.first(where: { $0 is JKHealthReportController}) {
            UINavigationController.jk_topNav().popToViewController(targetViewController, animated: false)
            UINavigationController.jk_topNav().pushViewController(JKHealthReportFilesController(title: "原始资料"), animated: true)
 }

🌟在 Swift 闭包中,$0 是一种特殊的语法,用于表示闭包的第一个参数。它可以用于简化闭包的书写。


10、Switch

let anotherCharacter: Character = "a"
let message :String
 switch anotherCharacter {
case "a":
    "The first letter of the Latin alphabet"
case "z":
    "The last letter of the Latin alphabet"
default:
    "Some other character"
}
// 🌟没有隐式贯穿,不需要break


// 匹配多个值可以用逗号分隔
let anotherCharacter: Character = "a"
switch anotherCharacter {
case "a", "A":
    print("The letter A")
default:
    print("Not the letter A")
}

// 可以区间条件匹配
let approximateCount = 62
let countedThings = "moons orbiting Saturn"
var naturalCount: String
switch approximateCount {
case 12..<100:
    naturalCount = "dozens of"
case 100..<1000:
    naturalCount = "hundreds of"
default:
    naturalCount = "many"
}


// switch 情况可以将匹配到的值临时绑定为一个常量或者变量
let anotherPoint = (2, 0)
switch anotherPoint {
case (let x, 0):
    print("on the x-axis with an x value of \(x)")
case (0, let y):
    print("on the y-axis with a y value of \(y)")
case let (x, y):
    print("somewhere else at (\(x), \(y))")
}

11、类型检查
is :来检查一个实例是否属于一个特定的子类
as? 或 as! :向下类型转换至其子类类型

举个例子(Movie和Song同时继承父类MediaItem,library是MediaItem的数组)

//前提
let library = [
    Movie(name: "Casablanca", director: "Michael Curtiz"),
    Song(name: "Blue Suede Shoes", artist: "Elvis Presley"),
    Movie(name: "Citizen Kane", director: "Orson Welles"),
    Song(name: "The One And Only", artist: "Chesney Hawkes"),
    Song(name: "Never Gonna Give You Up", artist: "Rick Astley")
]
// "library" 的类型被推断为[MediaItem]

// is使用如下
for item in library {
    if item is Movie {
        movieCount += 1
    } else if item is Song {
        songCount += 1
    }
}

// as? 或 as!使用如下
for item in library {
    if let movie = item as? Movie {
        print("Movie: '\(movie.name)', dir. \(movie.director)")
    } else if let song = item as? Song {
        print("Song: '\(song.name)', by \(song.artist)")
    }
}

Any 和 AnyObject 的类型转换

  • AnyObject 可以表示任何类类型的实例。
  • Any 可以表示任何类型,包括函数类型。

as 和 as? as! swift中区别如下:

在 Swift 中,as 关键字是用于转换类型的。它有如下三种形式:
as?:可选转换,将一个实例转换为一个可选的目标类型。如果实例可以转换为该类型,则返回可选值,否则返回 nil。
as!:强制转换,将一个实例强制转换为目标类型。如果实例不能转换为该类型,则会在运行时引发异常。
as :条件转换,将一个实例转换为目标类型。如果实例不能转换为该类型,则返回 nil。
因此,这三种形式的 as 在 Swift 中有不同的含义和使用方法。一般来说,当您确定转换一定可以成功时,使用 as! 进行强制转换会更加方便;而当您无法确定转换是否可以成功时,使用 as? 进行可选转换会更加安全。而 as 则需要根据实际情况进行选择,如果您希望在失败时返回 nil,那么使用 as,否则可以使用 as! 或者 try! 等方式。
🌟需要注意的是,在使用 as 进行转换时,目标类型必须是可选类型或允许为空的类型(比如 Optional,Any 和 AnyObject),否则编译器会报错。

进一步说明as 和 as?区别
在 Swift 中,as 和 as? 都是用于类型转换的关键字,但它们在转换失败时的处理方式不同。
在进行类型转换时,如果转换目标类型不能完全匹配原始类型,那么就需要进行类型转换。
当使用 as 进行类型转换时,如果无法将原始类型转换为目标类型,则会返回一个可选类型,其值为 nil,表示类型转换失败。
而当使用 as? 进行类型转换时,如果无法将原始类型转换为目标类型,则会返回 nil,而不是一个可选类型。这意味着,在使用 as? 进行类型转换时,您需要在代码中明确地处理类型转换失败的情况;而在使用 as 进行类型转换时,则可以使用可选绑定或空合运算符等机制来处理转换失败的情况。

let value: Any = 42

// 使用 as? 进行类型转换
if let intValue = value as? Int {
    print("The integer value is \(intValue)")
} else {
    print("Cannot convert to integer")
}

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

推荐阅读更多精彩内容