2.Swift初探-基本语法
来源:互联网 发布:最短路径算法原理 编辑:程序博客网 时间:2024/05/20 07:52
1.if 表达式
var optionalString: String? = "Hello"print(optionalString == nil)var optionalName: String? = "John Appleseed"var greeting = "Hello!"if let name = optionalName { greeting = "Hello, \(name)"}
在if
语句中,条件必须是一个布尔表达式——这意味着像if score { ... }
这样的代码将报错,而不会隐形地与 0 做对比。你可以一起使用if
和let
来处理值缺失的情况。这些值可由可选值来代表。一个可选的值是一个具体的值或者是nil
以表示值缺失。在类型后面加一个问号来标记这个变量的值是可选的。
2.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.")}
switch
支持任意类型的数据以及各种比较操作——不仅仅是整数以及测试相等。注意let
在上述例子的等式中是如何使用的,它将匹配等式的值赋给常量x
。运行switch
中匹配到的子句之后,程序会退出switch
语句,并不会继续向下运行,所以不需要在每个子句结尾写break
。3.for循环
var largest = 0for (kind, numbers) in interestingNumbers { for number in numbers { if number > largest { largest = number } }}print(largest)var firstForLoop = 0for i in 0..<4 { firstForLoop += i}print(firstForLoop)遍历字典或者迭代都可以使用for in语句,使用
..<
创建的范围不包含上界,如果想包含的话需要使用...
4.函数
func calculateStatistics(scores: [Int]) -> (min: Int, max: Int, sum: Int) { var min = scores[0] var max = scores[0] var sum = 0 for score in scores { if score > max { max = score } else if score < min { min = score } sum += score } return (min, max, sum)}let statistics = calculateStatistics([5, 3, 100, 3, 9])print(statistics.sum)print(statistics.2)
上例可以使用元组作为返回值
func sumOf(numbers: Int...) -> Int { var sum = 0 for number in numbers { sum += number } return sum}sumOf()sumOf(42, 597, 12)
上例 函数有不等个参数时,参数在函数内部表现为数组形式
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(numbers, condition: lessThanTen)
函数实际上是一种特殊的闭包:它是一段能之后被调取的代码。闭包中的代码能访问闭包所建作用域中能得到的变量和函数,即使闭包是在一个不同的作用域被执行的 - 你已经在嵌套函数例子中所看到。你可以使用
{}
来创建一个匿名闭包。使用in
将参数和返回值类型声明与闭包函数体进行分离。5.对象和类
class Square: NamedShape { var sideLength: Double init(sideLength: Double, name: String) { self.sideLength = sideLength super.init(name: name) numberOfSides = 4 } func area() -> Double { return sideLength * sideLength } override func simpleDescription() -> String { return "A square with sides of length \(sideLength)." }}let test = Square(sideLength: 5.2, name: "my test square")test.area()test.simpleDescription()
上例即是一个常规的类。
注意self
被用来区别实例变量。当你创建实例的时候,像传入函数参数一样给类传入构造器的参数。每个属性都需要赋值——无论是通过声明(就像numberOfSides
)还是通过构造器(就像name
)。
如果你需要在删除对象之前进行一些清理工作,使用deinit
创建一个析构函数。
子类的定义方法是在它们的类名后面加上父类的名字,用冒号分割。创建类的时候并不需要一个标准的根类,所以你可以忽略父类。
子类如果要重写父类的方法的话,需要用override
标记——如果没有添加override
就重写父类方法的话编译器会报错。编译器同样会检测override
标记的方法是否确实在父类中。
class EquilateralTriangle: NamedShape { var sideLength: Double = 0.0 init(sideLength: Double, name: String) { self.sideLength = sideLength super.init(name: name) numberOfSides = 3 } var perimeter: Double { get { return 3.0 * sideLength } set { sideLength = newValue / 3.0 } } override func simpleDescription() -> String { return "An equilateral triagle with sides of length \(sideLength)." }}var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")print(triangle.perimeter)triangle.perimeter = 9.9print(triangle.sideLength)
除了储存简单的属性之外,属性可以有 getter 和 setter 。
注意EquilateralTriangle
类的构造器执行了三步:
- 设置子类声明的属性值
- 调用父类的构造器
- 改变父类定义的属性值。其他的工作比如调用方法、getters和setters也可以在这个阶段完成。
6.枚举和结构体
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.Acelet aceRawValue = ace.rawValue
使用
enum
来创建一个枚举。就像类和其他所有命名类型一样,枚举可以包含方法。在上面的例子中,枚举原始值的类型是Int
,所以你只需要设置第一个原始值。剩下的原始值会按照顺序赋值。你也可以使用字符串或者浮点数作为枚举的原始值。使用rawValue
属性来访问一个枚举成员的原始值。
使用init?(rawValue:)
初始化构造器在原始值和枚举值之间进行转换。
7.结构体
使用
struct
来创建一个结构体。结构体和类有很多相同的地方,比如方法和构造器。它们之间最大的一个区别就是结构体是传值,类是传引用。<span style="font-size:10px;">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()</span>
8.协议和扩展
使用protocol
来声明一个协议。类、枚举和结构体都可以实现协议。
protocol ExampleProtocol { var simpleDescription: String { get } mutating func adjust()}
class SimpleClass: ExampleProtocol { var simpleDescription: String = "A very simple class." var anotherProperty: Int = 69105 func adjust() { simpleDescription += " Now 100% adjusted." }}var a = SimpleClass()a.adjust()let aDescription = a.simpleDescriptionstruct SimpleStructure: ExampleProtocol { var simpleDescription: String = "A simple structure" mutating func adjust() { simpleDescription += " (adjusted)" }}var b = SimpleStructure()b.adjust()let bDescription = b.simpleDescription
注意声明
SimpleStructure
时候mutating
关键字用来标记一个会修改结构体的方法。SimpleClass
的声明不需要标记任何方法,因为类中的方法通常可以修改类属性(类的性质)。 使用
extension
来为现有的类型添加功能,比如新的方法和计算属性。你可以使用扩展在别处修改定义,甚至是从外部库或者框架引入的一个类型,使得这个类型遵循某个协议。extension Int: ExampleProtocol { var simpleDescription: String { return "The number \(self)" } mutating func adjust() { self += 42 }}print(7.simpleDescription)
let protocolValue: ExampleProtocol = aprint(protocolValue.simpleDescription)// print(protocolValue.anotherProperty) // Uncomment to see the error
0 0
- 2.Swift初探-基本语法
- 3.Swift初探-基本语法
- swift语法初探 -- 1
- Scala基本语法初探
- Swift基本语法
- swift的基本语法
- Swift基本语法
- Swift基本语法
- Swift的基本语法
- Swift基本语法
- swift基本语法简介
- swift基本语法
- Swift基本语法
- IOS:Swift基本语法
- swift 的基本语法
- swift的基本语法
- swift基本语法
- swift的基本语法
- 展讯SC7730:Camera兼容引起的打开失败问题
- 设计模式
- 答大一学生:我的专业真这么烂吗?
- 简单的对象池技术实现 DEMO
- char 与 unsigned char的本质区别
- 2.Swift初探-基本语法
- 转载 C++的运算符重载
- C#编译器
- Xcode 7 缺少 *.dylib库的解决方法
- 执行多个用例
- Android网络编程之URLConnection和HttpClient访问服务器
- openmeetings3.0.6 二次改动(无需源码)
- 2015年各国竞争力排名,中国领跑金砖国家
- uboot移植 --添加目标板(转载学习使用)