与协议相比,我正在尝试了解泛型在编译和运行时阶段的作用。
我知道协议如何与存在类型做出反应。
我年轻的时候经常搞砸,我构建了一个应用程序,我目前正在尝试修复并改进该应用程序,但是我在将 s
可选类型 可选类型用来处理值可能缺失的情况,当在类型后面加上问号则可以定义为可选类型。 可选类型一共有两种结果 <1>没值,为nil <2>有值,拆包后可以拿到对应类型的值。 比如string有个转换为int的方法,这个方法的返回值是int?,因为可能转换失败,转换失败则为nil。 strToInt 和 snumToInt 即为int?类型,strToInt转换失败此时为nil。 nil swi
赋值运算符 元祖的赋值如下: let (x, y) = (1, 2)
// 现在 x 等于 1, y 等于 2 与c语言等语言的区别是,swift语言的赋值不返回值 if x = y {
// 此句错误, 因为 x = y 并不返回任何值
} 此特性可以使你避免将 == 写成=,否则会直接报错。 浮点数的取余运算符 print(10.5 % 2.5)值为0.5 空合运算符 a ?? b 将
字符串是值类型 与NSString不同,创建了一个NSString实例,并将其传递给一个函数/方法,或者赋值给一个变量。 传递或赋值的是该NSString实例的一个引用,除非您特别要求进行值拷贝,否则字符串不会生成新的副本来进行赋值操作。 Swift 默认字符串拷贝的方式保证了在函数/方法中传递的是字符串的值。 很明显无论该值来自于哪里,都是独自拥有的,字符串本身不会被更改。 在实际编译时,Swi
数组 创建一个空数组 var someInt = [Int]()
print("someInt is of type [int] with \(someInt.count) items") 创建有默认值的数组 var someInt = [Double](count: 3, repeatedValue: 0.0)// [0.0,0.0,0.0] 数组相加 var someInt = [Double
For循环 for循环有两种形式,一种是for in 可以方便的变量数组等集合类型,另一张是与c语言类型的基本for循环。 for in let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
for (animalName, legCount) in numberOfLegs {
print("\(animalName)s have \
函数的定义与调用 func sayHello(personName: String) -> String {
let greeting = "Hello, " + personName + "!"
return greeting
}
print(sayHello("Anna"))
// prints "Hello, Anna!"
print(sayHello("Brian"))
/
闭包表达式语法 { (parameters) -> returnType in
statements
} let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
names.sort({ (s1: String, s2: String) -> Bool in
return s1 > s2
}) 根据上下文推断 let na
枚举语法 enum CompassPoint {
case North
case South
case East
case West
}
var directionToHead = CompassPoint.West
directionToHead = .South directionToHead的类型被推断当它被CompassPoint的一个可能值初始化。 一旦d
定义 struct Resolution {
var width = 0
var height = 0
}
class VideoMode {
var resolution = Resolution()
var interlaced = false
var frameRate = 0.0
var name: String?
}
let someRe
存储属性 struct FixedLengthRange {
var firstValue: Int
let length : Int
}
var rangeOfThreeItems = FixedLengthRange(firstValue: 0,length :3)
// 该区间表示整数0,1,2
rangeOfThreeItems.firstValue = 6
// 该区间现
实例方法 class Counter {
var count = 0
func increment() {
count++
}
func incrementBy(amount: Int) {
count += amount
}
func reset() {
count = 0
}
}
let c
下标脚本语法 subscript(index: Int) -> Int {
get {
// 返回与入参匹配的Int类型的值
}
set(newValue) {
// 执行赋值操作
}
} 实例如下: struct TimesTable {
let multiplier: Int
subscript(index: Int)
定义基类 class Vehicle {
var currentSpeed = 0.0
var description: String {
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise() {
// 什么也不做-因为车辆不一定会有噪音
原理 class Person {
let name: String
init(name: String) {
self.name = name
print("\(name) is being initialized")
}
deinit {
print("\(name) is being deinitialized"
class MediaItem {
var name: String
init(name: String) {
self.name = name
}
}
class Movie: MediaItem {
var director: String
init(name: String, director: String) {
se
扩展就是向一个已有的类、结构体或枚举类型添加新功能。这包括在没有权限获取原始源代码的情况下扩展类型的能力。 Swift 中的扩展可以: 1.添加计算型属性和计算静态属性 2.定义实例方法和类型方法 3.提供新的构造器 4.定义下标 5.定义和使用新的嵌套类型 6.使一个已有类型符合某个协议 计算型属性 extension Double {
var km: Double { return s
存储属性的初始赋值 类和结构体在实例创建时,必须为所有存储型属性设置合适的初始值。存储型属性的值不能处于一个未知的状态。 你可以在构造器中为存储型属性赋初值,也可以在定义属性时为其设置默认值。 注:当你为存储型属性设置默认值或者在构造器中为其赋值时,它们的值是被直接设置的,不会触发任何属性观测器 构造器 struct Fahrenheit {
var temperature: Double
Swift 会自动释放不再需要的实例以释放资源。Swift 通过自动引用计数(ARC)处理实例的内存管理。 通常当你的实例被释放时不需要手动地去清理。但是,当使用自己的资源时,你可能需要进行一些额外的清理。 例如,如果创建了一个自定义的类来打开一个文件,并写入一些数据,你可能需要在类实例被释放之前关闭该文件。 在类的定义中,每个类最多只能有一个析构函数。析构函数不带任何参数,在写法上不带括号: d