欢迎swift
from 一个程序员的自我修养 swift
- 于swift
- 初识swift
- 单值
- 程控制
- 数和闭包
- 构体和类
- 口和扩展
关于swift
- ** ** swift是一种基于C和Objective-C的编程语言 无限制的和C兼容
初识swift
- 打印hello world
print("hello world!")
你不需要引像input/output 或者字符串操作入单独的库文件 全局作 用域中的代码会被自动当做程序的入口点,所以你也不需要 main 函数。你同样不需要在每 个语句结尾写上分号。
简单值
- 使用 let 来声明常量,使用 var 来声明变量
- 一个常量的值在编译时并不需要获取,但是你
只能为它赋值一次。
var myVariable = 42
myVariable = 50
let myConstant = 42
常量或者变量的类型必须和你赋给它们的值一样。然而,声明时类型是可选的,声明的同时 赋值的话,编译器会自动推断类型。在上面的例子中,编译器推断出 myVariable 是一个整 数(integer)因为它的初始值是整数。
**如果初始值没有供足够的信息(或者没有初始值),那你需要在变量后面声明类型,用冒 号分割。 **
let lab = "The Width is"
let width = 70
let widthLable = lab + String(width)
** 有一种更简单的把值转换成字符串的方法:把值写到括号中,并且在括号之前写一个反斜杠。
例如:**
1. let apples = 3 2. let oranges = 5
3. let appleSummary = "I have \(apples) apples."
4. let fruitSummary = "I have \(apples + oranges) pieces of fruit."
使用方括号[]来创建数组和字典,并使用下标或者键(key)来访问元素。
1. var shoppingList = ["catfish", "water", "tulips", "blue paint"] The Swift
2. shoppingList[1] = "bottle of water"
3.
4. var occupations = [
5. "Malcolm": "Captain",
6. "Kaylee": "Mechanic", 7. ],
8. occupations["Jayne"] = "Public Relations"
创建一个空数组和空字典 可以用一下语法
let emptyArray = [String]()
let emptyDictionary = [String: Float]()
如果如果类型信息可以被推断出来 你可以这样写[ ]一个空数组 这样[ : ]写一个空字典 例如 当你给一个变量赋新值或者给一个函数传递一个参数的时候
shopList = []
occupations = [:]
流程控制
使用'if' 和'switch'进行条件判断 用'for-in','for','while'和'repeat-while'来循环 包裹条
件和循环变量括号可以省略,但是语句体的大括号是必须的。
let individualScores = [75, 43, 103, 87, 12]
var teamScore = 0
for score in individualScores {
if score > 50{
teamSocre += 3
} else {
teamScore += 1
}
}
print(teameScore)
在if的条件判断中,这个条件必须是Bool值的表达式 也就是说类似
if score {...}
这样的表达式是错误的 没有暗含和0的比较
可以使用if 和 let 来处理 有些变量的值是可选的值缺失的情况 那些值表现为是缺失的 ,一个可选值可能是一个具体值或者nil,nil表示值是缺失的 在类型后面加一个问号来标记这个变量值是可选的
1. var optionalString: String? = "Hello"
2. optionalString == nil
3.
4. var optionalName: String? = "John Appleseed"
5. var greeting = "Hello!"
6. if let name = optionalName {
7. greeting = "Hello, \(name)"
8. }
如果变量的可选值是 nil
,条件会判断为 false
,大括号中的代码会被跳过。如果不是 nil
,会 将值赋给 let
后面的常量,这样代码块中就可以使用这个值了。
另一种操作可选值的方式是 提供一个用‘??’修饰的默认值 如果可选值没有 使用默认值代替
let nickName :String? = nil
let fullName: String = "John Appleseed"
print("Hi \(nickName ?? fullName)")
switch 支持任意类型的数据以及各种比较操作——不仅仅是整数以及测试相等。
1. let vegetable = "red pepper"
2. switch vegetable {
3. case "celery":
4. print("Add some raisins and make ants on a log.")
5. case "cucumber", "watercress":
6. print("That would make a good tea sandwich." )
7. case let x where x.hasSuffix("pepper"):
8. print("Is it a spicy \(x)?")
9. default:
10. print("Everything tastes good in soup." )
11. }
_运行 switch 中匹配到的子句之后,程序会退出 switch
语句,并不会继续向下运行,所以不 需要在每个子句结尾写 break
。
注意 如何在一个模式中使用
let
来绑定和匹配一个实例的模式的一部分
可以使用 for-in
通过键值对的名字来枚举出 一个字典的元素 字典是一个无序集合 所以他们的keys-Values是无序枚举出来的
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 (key, number) in interestingNumbers {
for ((kind, numbers) in interesting)
for (number,numbers) {
if number > largest{
largest = number
}
}
}
print(largest)
用while
来重复调用一个代码块 直到一个条件改变 循环的条件可以放在末尾 以确保循环至少运行一次
var n = 2
while n < 100 {
n = n * 2
}
print(n)
var m = 2
repeat {
m = m * 2
} while m < 100
print(m)
你可以下标 循环 使用
..<
来表示一个下标的范围 或者使用一个 初始值 条件语句 增加幅度值来指示范围 这两个循环是相同的
var firstForLoop = 0
for i in 0..<4 {
firstForLoop += 1
}
print(firstForLoop)
var secondForLoop = 0
for var i = 0 ; i < 4; ++i {
secondForLoop = i
}
print(secondForLoop)
使用 ..<
来指示一个忽略上限的范围 使用 ...
来制造一个包含边界值的范围
函数和闭包
使用fun
来声明一个函数 通过含有参数的列表的函数名字调用它 使用 ->
来分隔开参数和返回值
func greet(name: String, day: String) -> String {
return "Hello \(name), today is \(today)"
}
greet("Bob", day: "Tuesday")
结构体和类
使用 struct 来创建一个结构体。结构体和类有很多相同的地方,比如方法和构造器。它们结 构体之间最大的一个区别就是 结构体是传值,类是传引用。
一个枚举成员的实例可以有实例值。相同枚举成员的实例可以有不同的值。创建实例的时候 传入值即可。实例值和原始值是不同的:枚举成员的原始值对于所有实例都是相同的,而且 你是在定义枚举的时候设置原始值。
接口和扩展
使用 protocol 来声明一个接口。
1. protocol ExampleProtocol {
2. var simpleDescription: String { get }
3. mutating func adjust()
4. }
类、枚举和结构体都可以实现接口。
class SimpleClass: ExampleProtocol{
var simpleDescription: String = "A very simple class."
var anotherProperty: Int = 69105
func adjuest(){
simpleDescription += " Now 100% adjuest"
}
}
var a = SimpleClass()
a.adjuest()
let aDescription = a.simpleDescription
struct SimpleStructre : ExampleProtocol {
var simpleDescription: String = "A simple structure "
mutating func adjuest() {
simpleDescription += " (adjuested)"
}
}
var b = SimpleStructure()
b.adjuest()
let bDescription = b.simpleDescription
//写一个枚举的代理实现
enum SimpleEnum: SimpleProtocol {
var simpleDescription: String = "A simple Enum "
case OuterDoor
case innerDoor
mutating func adjuest(){
simpleDescription += "\(self)"
}
}
扩展和协议
extension Int: ExampleProtocol {
var simpleDescription: String {
return "The number is \(self)"
}
mutating func adjust() {
self += 42
}
}
print(7.simpleDescription)