欢迎swift

欢迎swift

from 一个程序员的自我修养 swift


  • 于swift
  • 初识swift
    • 单值
  • 程控制
    • 数和闭包
    • 构体和类
    • 口和扩展

关于swift

  • ** ** swift是一种基于C和Objective-C的编程语言 无限制的和C兼容

初识swift

  • 打印hello world
print("hello world!")

你不需要引像input/output 或者字符串操作入单独的库文件 全局作 用域中的代码会被自动当做程序的入口点,所以你也不需要 main 函数。你同样不需要在每 个语句结尾写上分号。

简单值

  1. 使用 let 来声明常量,使用 var 来声明变量
  1. 一个常量的值在编译时并不需要获取,但是你
    只能为它赋值一次。
 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)

你可能感兴趣的:(欢迎swift)