前言:

1.此文中的语法会根据Swift的升级变动而更新。

2.如果需要请移步 -> swift2.2 语法(上)swift 2.2语法(下)

函数

  • 和C语言一样,swift也有函数,性质和我们熟悉的Objective-C的方法相当

  • 格式:

    1. func 函数名(参数列表) -> 返回值类型 {
    2. 代码块
    3. // 如果设置了返回值类型,就需要返回相应的返回值
    4. return 返回值
    5. }
    • func是swift内的关键字,参数列表内多个参数之间用 "," 隔开,可以没有参数
    • "->" 指向返回值类型
    • 当然,如果函数没有返回值(返回值为Void),那么 "-> 返回值类型" 这部分可以省略不写(默认就是没有返回值)
  • 函数几种定义方式:

    1. // 定义没有参数,没有返回值的函数
    2. // 标准写法
    3. func test1() -> Void {
    4. print("没有参数没有返回值的函数")
    5. }
    6. // 简写方式一
    7. func test2() -> () {
    8. print("没有参数没有返回值的函数")
    9. }
    10. // 简写方式二
    11. func test3() {
    12. print("没有参数没有返回值的函数")
    13. }
    14. // 定义有参数,没有返回值的函数
    15. // 标准写法
    16. func test1(num : Int) -> Void {
    17. print("有参数没有返回值的函数")
    18. }
    19. // 简写方式一
    20. func test2(num : Int) -> () {
    21. print("有参数没有返回值的函数")
    22. }
    23. // 简写方式二
    24. func test3(num : Int) {
    25. print("有参数没有返回值的函数")
    26. }
    27. // 定义没有参数,有返回值的函数
    28. // 标准写法
    29. func test1() -> Int {
    30. return 0
    31. }
    32. // 定义有返回值,有参数的函数
    33. // 标准写法
    34. func test1(num1 : Int, num2 : Int) -> Int {
    35. return num1 + num2
    36. }
    37. // 定义一个有参数,且有多个返回值的函数
    38. // 标准写法
    39. func test1(nums : [String]) -> (strCount : Int, spellString : String) {
    40. var strCount = 0
    41. var spellString = ""
    42. for num in nums {
    43. strCount++
    44. spellString = spellString + num
    45. }
    46. return (strCount, spellString)
    47. }
    48. // 调用函数
    49. print(test1(["abc", "def", "ghi"]))
  • 函数的外部参数和内部参数

    • 内部参数:在函数内部可以看到的参数
    • 外部参数:在函数外面可以看到的参数
    • 从第二个参数开始,参数名称即是内部参数也是外部参数(默认)
    1. // 先来定义一个拥有多个参数的函数
    2. func test1(num1 : Int, num2 : Int, num3 : Int) -> Void {
    3. print(num1, num2, num3)
    4. }
    5. // 在调用函数的时候可以看下区别
    6. /*
    7. * 第一个函数没有跟上我们定义参数时所给的标签
    8. * 后面的所有函数都有我们定义参数时所给的标签
    9. * 原因:从第二个参数开始,参数名称即是内部参数也是外部参数(默认)
    10. * 也就是说第一个参数默认为内部参数,所以不会显示标签
    11. */
    12. test1(5, num2: 6, num3: 7)
    • 如果第一个参数也想有外部参数,可以设置标签:在变量名前增加标签
    1. // 先来定义一个拥有多个参数的函数,但是这次我们要让第一个参数也有外部参数
    2. func test1(num1 num1: Int, num2 : Int, num3 : Int) -> Void {
    3. print(num1, num2, num3)
    4. }
    5. // 现在再调用函数可以看到第一个参数也变拥有外部参数
    6. test1(num1: 5, num2: 6, num3: 7)
    • 在参数名称前加 "_" ,表示不需要外部参数
    1. // 先来定义一个拥有多个参数的函数,这次我们让所有参数都为内部参数
    2. func test1 (num1 : Int, _ num2 : Int, _ num3 : Int) -> Void {
    3. print(num1, num2, num3)
    4. }
    5. // 现在调用函数就会发现所有的参数都成为内部参数了
    6. test1(5, 6, 7)
  • 函数重载

    • 函数名称相同,但参数不同,可以称为函数重载
    • 参数拥有内部参数或外部参数不同,也被认定为参数不同
    1. // 函数重载例:定义三个函数,函数名相同但函数的参数不同
    2. // 无返回值,第一个参数为内部参数,第二个参数同时拥有外部和内部参数
    3. func test(num1 : Int, num2 : Int) -> Void {
    4. print("第一个函数")
    5. }
    6. // 无返回值,且都同时没有外部参数
    7. func test(num1 : Int, _ num2 : Int) -> Void {
    8. print("第二个函数")
    9. }
    10. // 无返回值,但同时拥有外部和内部参数
    11. func test(num1 num1 : Int, num2 : Int) -> Void {
    12. print("第三个函数")
    13. }
    14. // 调用函数
    15. test(1, num2: 2)
    16. test(1, 2)
    17. test(num1: 1, num2: 2)
  • 默认参数

    • 在一些特定情况下,调用函数时如果没有传入具体参数,可以使用默认参数代替(相当于我们在定义参数时就给参数一个默认值)
    1. // 默认参数
    2. func test(num : Int = 5) -> Int {
    3. return num
    4. }
    5. // 调用参数不给值,返回的的就是默认值 “5”
    6. test()
  • 可变参数

    • swift函数的参数个数可以变化,可以接收不确定数量的输入类型参数
    • 需要注意的是,这些参数必须具有相同的类型
    • 方法:在参数类型后面加 "..." 表示参数为可变参数
    1. // 定义函数,参数为可变参数
    2. func test(nums : Int...) -> Int {
    3. var sum : Int = 0
    4. // 遍历内部元素
    5. for temp in nums {
    6. sum += temp
    7. }
    8. return sum
    9. }
    10. // 调用函数,结果为202
    11. test(20, 15, 35, 32, 100)
  • 指针传递(引用类型)

    • 函数的参数是通过值传递的方式,如果想改变外面的变量,需要传递变量地址(默认)
    • swift提供了 "inout" 关键字来帮助我们实现
    • 需要注意的都是,操作的必须是变量,因为需要在内部改变值
    1. // 比如C语言中常见的问题:交换2个变量的值
    2. // 先来看看正常的值传递
    3. // 定义需要交换值的2个变量a,b
    4. var a = 6
    5. var b = 9
    6. // 值传递方式
    7. func test(var num1: Int, var num2: Int) -> (num1 : Int, num2 : Int) {
    8. let temp = num1
    9. num1 = num2
    10. num2 = temp
    11. return (num1,num2)
    12. }
    13. // 调用函数(交换的只是函数内部参数的值,而a,b的值并没变)
    14. test(a, num2: b) // 结果 9 6
    15. print(a, b) // 结果 6 9
    16. // 通过上面的方式可以明显看出值传递并不能真实转换外部变量的值,在swift中我们可以通 过"inout"关键字来讲外部变量的值传给函数参数,再改变其值
    17. func test(inout num1 : Int, inout num2 : Int) -> (num1 : Int, num2 : Int) {
    18. let temp = num1
    19. num1 = num2
    20. num2 = temp
    21. return (num1, num2)
    22. }
    23. // 调用函数(因为传入的是a,b的变量地址,等于拿到了外部变量,函数内部操作的num1,num2可以看成a,b,因为他们的指针指向了a,b)
    24. test(&a, num2: &b)
    25. print(a,b)
  • 函数嵌套使用

    • swift中函数可以嵌套使用
    • 虽然可以嵌套使用,但是这种做法降低了可读性,所以尽量不要这样做
    1. // 函数嵌套
    2. let a = 100
    3. let b = 35
    4. func test() {
    5. func sum(num1 : Int, num2 : Int) {
    6. print("和为\(num1 + num2)")
    7. }
    8. print("test函数")
    9. sum(a, num2: b)
    10. }
    11. // 调用函数
    12. test() // 先调用test函数,再调用sum函数

    注意:无法调用sum函数,因为它是test函数的一部分

  • 函数类型

    • 每个函数都有属于自己的类型,由函数的参数类型和返回值类型组成
    1. // 函数类型:定义2个函数,且都为 (String, String) -> (String) 类型
    2. func test1(name : String, city : String) -> String {
    3. return name + city
    4. }
    5. func test2(tiele : String, iconUrl : String) -> String {
    6. return "图片名称:\(tiele)图片地址为:\(iconUrl)"
    7. }
  • 将函数作当成变量传递

  1. // 根据函数类型定义变量并将函数传递给变量
  2. var tempFunction : (String, String) -> String = test1
  3. // 使用变量名调用函数
  4. tempFunction("sd", "lw")
  • 将函数当成参数使用
  1. // 将函数当成参数使用
  2. func test3(str1 : String, str2 : String, tempFunction : (String, String) -> String) {
  3. print(tempFunction(str1, str2))
  4. }
  5. // 调用函数
  6. test3("aa", str2: "bb", tempFunction: test1) // 结果 aabb
  • 函数当成返回值
  1. // 函数作为方法返回值
  2. /**
  3. * 判断一数是否为负数,是负数返回0,不是则返回原来的值
  4. */
  5. // 正数调用此函数
  6. func positive(num : Int) -> Int {
  7. return num
  8. }
  9. // 负数调用此函数
  10. func negative(num : Int) -> Int {
  11. return 0
  12. }
  13. // 将函数作为返回值
  14. func test(num : Int) -> (Int) -> Int {
  15. // 如果函数小于1就是负数,返回negative函数,如果大于1,则是正数,返回positive函数
  16. return num < 0 ? negative : positive
  17. }
  18. // 获取返回值(函数)
  19. let function = test(-1) // 因为是负数,所以返回negative函数
  20. // 调用方法(再将-1传入返回的函数)
  21. function(-1) // 结果为 0

枚举类型

  • 枚举用来定义一组通用类型的相关值,可以让达到让使用者按照设计者的规范使用特定的值

  • swift的枚举非常灵活,可以给枚举成员提供一个字符串,一个字符,一个整型或浮点值,不必给每个枚举成员提供值

  • C语言和OC里面枚举指定的一组相关成员为整型

  • 枚举类型定义

    • 使用 enum 关键词,将定义放在{}内
    • 使用 case 关键词定义新枚举成员
    • 需要注意的是,swift的枚举在被创建的时候不会像C和OC那样赋予默认整型值
    1. // 枚举定义
    2. enum testType {
    3. case testTypeOne
    4. case testTypeTwo
    5. case testTypeThree
    6. }
    7. // 当然也可以简写成下面的方式(在枚举成员特别多的情况下很好用)
    8. enum testType {
    9. case testTypeOne, testTypeTwo, testTypeThree
    10. }
  • 枚举类型赋值

  • 枚举类型赋值可以是整型、浮点型、字符、字符串

    • 如果有给枚举类型赋值,必须在枚举类型后面明确类型使用的类型
    1. // 枚举类型赋值
    2. enum testType1 : Int {
    3. case One = 1
    4. case Two = 2
    5. case Three = 3
    6. }
    7. // 或
    8. enum testType2 : Int{
    9. case One = 1, Two, Three
    10. }
  • 枚举类型使用

  1. // 枚举类型赋值(整型)
  2. enum testType1 : Int {
  3. case One = 1
  4. case Two
  5. case Three
  6. }
  7. // 枚举类型赋值(字符串)
  8. enum testType2 : String{
  9. case One = "a", Two = "b", Three
  10. }
  11. let j = testType1(rawValue: 2) // 获取到枚举成员Two
  12. // 结果为Two
  13. if let j = j {
  14. switch j {
  15. case .One:
  16. print("One")
  17. case .Two:
  18. print("Two")
  19. case .Three:
  20. print("Three")
  21. }
  22. }
  23. let i = testType2(rawValue: "a") // 获取到枚举成员One
  24. // 结果为One
  25. if let i = i {
  26. switch i {
  27. case .One:
  28. print("One")
  29. case .Two:
  30. print("Two")
  31. case .Three:
  32. print("Three")
  33. }
  34. }

注意:


1.如果明确了类型为整型且未设置初始值,那么由0开始依次递增(默认)


2.如果明确了类型为整型但设置了初始值,就由初始值依次递增


结构体(struct)

  • 结构体是一种数据结构

  • 结构体在方法(函数)中传递时时值传递,是值类型

  • 结构体是由一组相同类型或不同类型的数据组成的数据集合

  • 在特定情况下使用结构体,能使我们的代码结构更清晰

  • 定义结构体格式

  1. struct 结构体名称 {
  2. 属性
  3. }
  • 结构体使用
  1. /**
  2. * 在手势开发过程中,我们需要监听手指移动的位置,这边我们来判断手指移动的开始位置和结束位置距离是否大于50
  3. */
  4. // 初始化结构体
  5. struct touchPoint {
  6. var x : Double
  7. var y : Double
  8. }
  9. // 定义函数
  10. func Range(point : touchPoint) -> Bool {
  11. let tempX = point.x - startX
  12. let tempY = point.y - startY
  13. // sqrt(n)用来计算n的平方根
  14. // pow(x, n)用来计算x的n次方
  15. let range = sqrt(pow(tempX, 2) + pow(tempY,2))
  16. return range > 50
  17. }
  18. // 创建结构体
  19. let start = touchPoint(x:53.0, y:21.0)
  20. let end = touchPoint(x: 120.0, y: 320.0)
  21. // 调用函数
  22. Range(point) // 结果:true
  • 结构体增强

    • 扩充构造函数

      • 默认情况下创建touchPoint时使用touchPoint(x:,y:)
      • 为了更加灵活地使用结构体,swift支持对构造函数进行扩充
      • 在扩充的构造函数中必须保证成员变量有值
      • 扩充的构造函数会覆盖原有的构造函数

截止至:5.17 —— 1:00 5.18继续

类的定义

  • swift也是面向对象开发的语言,而面向对象的基础是类,由类产生对象

  • 在swift中定义类使用 class 关键字

  • 类的注意点:

    • 定义的类可以没有父类,也就是这个类就是rootClass
    • 一般情况下,定义类的时候,继承自NSObject(但并不是OC中的NSObject)
  • 格式:class 类名 : 父类 {

    属性,方法

    }

  • 类的属性

    • siwft中类的属性分为:

      • 存储属性: 存储实例常量和变量的属性
      • 类属性:与整个类自身相关的属性
      • 计算属性:通过某些算法计算出来的属性
  • 存储属性

    • 存储属性是最简单的属性,作为类实例的一部分,用于存储变量和常量
    • 可给存储属性提供默认值,也可以在初始化方法中对其进行初始化
    1. // 定义person类
    2. class person: NSObject {
    3. // 定义存储属性
    4. var name : String? // 名字
    5. var age : Int = 0 // 年龄
    6. }
    7. // 创建person对象
    8. let ps = person()
    9. // 给存储属性赋值
    10. ps.name = "stephen"
    11. ps.age = 23
  • 类属性

    • 类属性是与类相关联的属性,但不是与类实例相关联的属性
    • 所有的实例和类共有一份类属性,所以只要有某一处修改,这个类的属性就会被修改
    • 类属性的设置和修改必须通过类来完成
    • 类属性使用 static 来修饰
    1. // 定义person类
    2. class person: NSObject {
    3. // 定义存储属性
    4. var name : String? // 名字
    5. var age : Int = 0 // 年龄
    6. // 类属性
    7. static var nickName : String?
    8. }
    9. // 设置类属性值
    10. person.nickName = "laoWang"
    11. // 打印
    12. print(person.nickName!) // 结果:laoWang
  • 计算属性

    • 计算属性并不会存储实际的值,而是提供一个getter和一个setter(可选类型)间接获取和设置其它属性
    • 一般情况下,只会提供getter方法,这种情况下的计算属性为只读属性,可以省略 get{}
    1. // 定义person类
    2. class person: NSObject {
    3. // 定义存储属性
    4. var foodIntake : Double = 0.0 // 人的食量(一顿吃几碗)
    5. var consume : Double = 0.0 // 消耗量
    6. // 定义计算属性(差值)
    7. var difference : Double {
    8. get {
    9. return (foodIntake - consume)
    10. }
    11. // newValue是系统自动分配的变量名,内部用来存储新的值
    12. // 里面放的是get方法里面计算的值
    13. set {
    14. self.difference = newValue
    15. }
    16. }
    17. }
    18. // 创建person对象
    19. let ps = person()
    20. ps.foodIntake = 50 // 吃的有点多肯定比我胖
    21. ps.consume = 25 // 消耗这么多惊呆小伙伴,看来是个肌肉男
    22. // 打印
    23. print(ps.difference) // 结果 25.0

类的属性改变监听

  • OC里面我们可以重写set方法来监听属性值的改变
  • swift则需要通过属性观察者来监听和相应属性值的变化
  • 一般只会监听存储属性和类属性改变,计算属性我们不需要定义属性观察者,因为我们可以在计算属性的setter中直接观察并响应其值得变化
  • swift使用下面的观察方法定义观察者
    • willSet:在属性值被存储之前设置(新值会通过常量参数的方式传入,这个参数就是newValue,我们可以给这个参数定义参数名,但一般保持默认)
    • didSet:新值被存储后立即调用这个方法,和willSet相同,这时传入的值是属性的旧值,默认的参数名叫oldValue
    • willSet和didSet只在属性第一次被设置的时候才会调用,初始化的时候并不会调用这2个监听方法
  1. class person: NSObject {
  2. var name : String? {
  3. willSet (newValue) { // 属性即将改变时调用
  4. // 会传入系统默认的属性newValue,用来存储新值
  5. print("name:\(name), newValue:\(newValue)") // 结果:name:nil, newValue:Optional("laoWang")
  6. }
  7. didSet (oldValue) {
  8. // 会传入系统默认的属性oldValue,用来存储旧值
  9. print("name:\(name), oldValue\(oldValue)") // 结果:name:Optional("laoWang"), oldValuenil
  10. }
  11. }
  12. }
  13. // 创建person对象
  14. let ps : person = person()
  15. ps.name = "laoWang"

类的构造函数

  • 默认情况下创建一个类的时候,就会调用一个构造函数

  • 就算我们没有编写任何构造函数,编译器也会提供一个默认的构造函数

  • 如果类继承自NSObject,可以对父类的构造函数进行重写

  • 构造函数和OC中的初始化方法init:相似

  • 构造函数使用

    • 类的属性必须有值
    • 如果在定义时没有初始化值,可以在构造函数内进行赋值
    1. class person: NSObject {
    2. var name : String
    3. // 因为继承自NSObject,我们就重写(父类)的构造方法
    4. // override关键字表示调用父类方法
    5. override init() {
    6. // 在初始化name属性时没有给它赋值,所以可以在构造函数里面进行赋值
    7. name = "laoWang"
    8. }
    9. }
    10. // 创建person对象
    11. let ps : person = person()
    12. print(ps.name) // 结果:laoWang
  • 初始化时给属性赋值

    • 一般我们在创建一个对象的时候就会同时给属性赋值,这时候我们可以自定义构造函数
    • 需要注意的:如果我们自定义了构造函数,就会覆盖init:方法,也就是说不会有默认构造函数
    1. class person: NSObject {
    2. var name : String
    3. // 自定义构造函数,覆盖init:函数
    4. init(name : String) {
    5. // 在初始化self.name属性时没有给它赋值,所以可以在构造函数里面进行赋值
    6. self.name = name
    7. }
    8. }
    9. // 创建person对象
    10. let ps : person = person(name: "laoWang")
    11. print(ps.name) // 结果:laoWang
  • 字典转模型方式一

    • 开发中,我们经常会将字典转换成模型在来使用,这边就以此做例子
    • 需要注意的是:字典中取出的数据类型为NSObject,我们可以通过as!将其转成需要的类型
    1. class person: NSObject {
    2. var name : String
    3. // 自定义构造函数,覆盖init:函数
    4. init(dict : [String : NSObject]) {
    5. self.name = dict["name"] as! String
    6. }
    7. }
    8. // 创建person对象
    9. let ps : person = person(dict:["name" : "laoWang"])
    10. print(ps.name) // 结果:laoWang
  • 字典转模型方式二

    • 开发中我们经常会用KVC的方式将字典转成模型,这边就使用KVC对字典进行转换

    • 需要注意的是:KVC不能保证给所有属性赋值,所以属性需要有默认的值

      • 对象、结构体类型定义一般为可选类型就可以了,因为可选类型没有赋值前为nil
      • 基本数据类型一般设置为0
      1. class person: NSObject {
      2. // KVC方式下,对象、结构体类型必须是可选类型,否则无法转换
      3. var name : String?
      4. // 自定义构造函数,覆盖init:函数
      5. init(dict : [String : NSObject]) {
      6. // 必须先初始化对象
      7. super.init()
      8. // 调用对象的KVC方法
      9. setValuesForKeysWithDictionary(dict)
      10. }
      11. }
      12. // 创建person对象
      13. let ps : person = person(dict:["name" : "laoWang"])
      14. print(ps.name) // 结果:laoWang

swift 2.2 语法 (中)的更多相关文章

  1. swift 2.2 语法 (下)

    前言: 1.此文中的语法会根据Swift的升级变动而更新. 2.如果需要请移步 -> swift2.2 语法(上).swift 2.2语法(中) 类的析构函数 swift会自动释放不需要的实例来 ...

  2. swift 2.2 语法 (上)

    前言: 1.此文中的语法会根据Swift的升级变动而更新. 2.如果需要请移步 -> swift2.2 语法(中).swift 2.2语法(下) Swift与OC中常见的区别 导入框架 OC: ...

  3. iOS开发--Swift 如何完成工程中Swift和OC的混编桥接(Cocoapods同样适用)

    由于SDK现在大部分都是OC版本, 所以假如你是一名主要以Swift语言进行开发的开发者, 就要面临如何让OC和Swift兼容在一个工程中, 如果你没有进行过这样的操作, 会感觉异常的茫然, 不用担心 ...

  4. C#语法中一个问号(?)和两个问号(??)的运算符是什么意思?

    (1).C#语法中一个个问号(?)的运算符是指:可以为 null 的类型. MSDN上面的解释: 在处理数据库和其他包含不可赋值的元素的数据类型时,将 null 赋值给数值类型或布尔型以及日期类型的功 ...

  5. C#语法中一个问号(?)和两个问号(??)的运算符

    (1).C#语法中一个个问号(?)的运算符是指:可以为 null 的类型. MSDN上面的解释: 在处理数据库和其他包含不可赋值的元素的数据类型时,将 null 赋值给数值类型或布尔型以及日期类型的功 ...

  6. 【原创】6. 在MYSQL++中实现SQL语法中的NULL

    这次要说明的是在MYSQL++中为了实现SQL中的NULL而做出的一系列的举措.我的感觉是Null<T, B>类型通常出现在SSQLS和template Query中比较多. 1. 什么是 ...

  7. swift 2.0 语法 分支

    import UIKit // 注意: Swift中可以不写;号, 但是有一定的前提条件, 一行只有一句代码 //      如果一行有多句代码, 那么;还是必须写 // 注意: Swift变态的地方 ...

  8. C++ 炼气期之基本结构语法中的底层逻辑

    1. 前言 从语言的分类角度而言,C++是一种非常特殊的存在.属于高级语言范畴,但又具有低级语言的直接访问硬件的能力,这也成就了C++语言的另类性,因保留有其原始特性,其语法并不象其它高级语言一样易理 ...

  9. iOS开发--Swift 最近项目开发中遇到的一些小问题与解决方法

    1, Swift 修改导航栏颜色 self.navigationController?.navigationBar.barTintColor 2, Swift button 属性设置时直接进行初始化 ...

随机推荐

  1. 研究 研究而已 java和.net的HashSet对比

    各位看官,,我不是在引发战争,,我只是想知道事情的真想,我源之于,一段代码我需要实现C#和java的两个版本功能,才发现这一个对比.讨论问题的实质,为什么会出现这样的问题.java和C#都很优秀.请大 ...

  2. Twitter Bootstrap深受开发者喜爱的11大理由

    Bootstrap,作为创新技术框架,使开发者.设计者更容易.更快捷.更出色地完成网站及应用的搭建工作.如果你还没有使用Twitter Bootstrap,建议你去了解一下.Bootstrap为开发者 ...

  3. linux专题一之文件描述符、重定向、管道符、tee命令

    本节讨论一下几个问题: 1. 文件描述符. 2. 重定向. 3. 管道符 4. tee的用法. 1. 文件描述符. 在linux系统中一切皆文件.文件夹和设备都是文件.如何用来区别不同的文件呢?这里的 ...

  4. C#--参数数组

  5. MYSQL 函数 字符串到整数

    SELECT CAST('002' AS signed) 结果为2 SELECT CAST('125e342.83' as signed) 结果为 125

  6. MVC 分页

    后台代码: using Webdiyer.WebControls.Mvc; ) { int pageIndex = id; int count; ; List<News> newsList ...

  7. hangfire+bootstrap ace 模板实现后台任务管理平台

    前言 前端时间刚开始接触Hangfire就翻译了一篇官方的教程[翻译+山寨]Hangfire Highlighter Tutorial,后来在工作中需要实现一个异步和定时执行的任务管理平台,就结合bo ...

  8. .net IO异步和Producer/Consumer队列实现一分钟n次http请求

    简介 最近工作中有一个需求:要求发送http请求到某站点获取相应的数据,但对方网站限制了请求的次数:一分钟最多200次请求. 搜索之后,在stackoverflow网站查到一个类似的问题..但里面用到 ...

  9. 【Linux_Fedora_应用系列】_2_如何安装视频播放器和视频文件解码

    在前面的一篇博文中,我们进行了音乐播放器的安装和解码器的安装.[Linux_Fedora_应用系列]_1_如何安装音乐播放器和mp3解码 这里我们来进行视频播放器的安装.我们还是通过yum方式安装. ...

  10. Scalaz(44)- concurrency :scalaz Future,尚不完整的多线程类型

    scala已经配备了自身的Future类.我们先举个例子来了解scala Future的具体操作: import scala.concurrent._ import ExecutionContext. ...