xml地图|网站地图|网站标签 [设为首页] [加入收藏]
Swift基础语法,的一些新特性
分类:编程

简介

  • 特点
    (1)优于OC,快速,安全
    (2)取消了预编译指令包括宏定义(OC用的太多了)
    (3)取消了OC指针和不安全访问的使用(看不到星星了)
    (4)舍弃 Objective-C 早期应用 Smalltalk 的语法,全面改为点语法
    (5)3.0中对Foundation框架做了很多改变,去除了NS,将绝大部分class转换成struct结构体(为了考虑性能和安全性,绝大部分使用结构体来代替以前的类,但是在实际使用感觉不到)
    (6)可以使用现有的 Cocoa 和 Cocoa Touch 框架
    , 以前是OC调UIKit,现在就是Swift调UIKit,这点事没问题的
    (7)Swift因为语法的严谨性可以让很多错误提前遇到,这样很少出现bug让程序停在main导致无法找到
    (8)@UIApplicationMain是程序的入口
    (9)只有.h没有.m
    (10)所有的代码都包括在{}里,默认方法func都有缩进!
    (11)语法的allocinit替换成()

  • PlayGround
    (1)可以看苹果官方自带的tips和100个tips,都在Placground来使用

  • 基础点
    (1)不适用self. 在闭包或者编译器提示的时候再使用
    (2)分号是用来分割语句的,如果一行洗很多,就可以加分号,一般时候可以不加
    (3)#function打印执行的函数
    (4)添加标记用到// MARK: - 选择,如果是接下来要做的可以用// TODO:和// FIXME:这些非常有用

只要你的Scrapy Field字段名字和 数据库字段的名字 一样。那么恭喜你你就可以拷贝这段SQL拼接脚本。进行MySQL入库处理。

Apple终于发布了Xcode 8.3以及Swift 3.1。如果你没时间仔细通读一遍release note,至少,Swift 3.1中的一些新特性还是值得了解的,为此,我们特别制作了一个免费的内容系列。当然,Swift 3.1和Swift 3在源代码级别是兼容的,因此,如果你的项目已经更新到了Swift 3,这次更新应该不会给你带来太多麻烦。但是,Xcode 8.3去掉了对Swift 2.3的支持,所以,如果你还停留在更早版本的Swift上,就还是谨慎更新的为好。

一、常量和变量

具体拼接代码如下:

接下来,我们就简单介绍下这个系列里的内容。

定义

  • let 定义常量,一经赋值不允许再修改
  • var 定义变量,赋值之后仍然可以修改
    常量和变量的细节

    • 使用 : 类型,仅仅只定义类型
    • 常量有一次设置的机会
    • 应该尽量先选择常量,只有在必须修改时,才需要修改为 var
// 定义常量并且直接设置数值
let x: Int = 10
// 常量数值一经设置,不能修改,以下代码会报错
// x = 30

let y: Int
// 常量有一次设置的机会,以下代码没有问题,因为 `y` 还没有被设置数值
y = 10

// 一旦设置之后,则不能再次修改,以下代码会报错,因为 `y` 已经被设置了数值
// y = 50

print(x + y)

// 变量设置数值之后,可以继续修改数值
var z: Int
z = 100
z = 200

print(x + y + z)
    def process_item(self, item, spider):
        if isinstance(item, WhoscoredNewItem):
            table_name = item.pop('table_name')
            col_str = ''
            row_str = ''
            for key in item.keys():
                col_str = col_str + " " + key + ","
                row_str = "{}'{}',".format(row_str, item[key] if "'" not in item[key] else item[key].replace("'", "\'"))
                sql = "insert INTO {} ({}) VALUES ({}) ON DUPLICATE KEY UPDATE ".format(table_name, col_str[1:-1], row_str[:-1])
            for (key, value) in six.iteritems(item):
                sql += "{} = '{}', ".format(key, value if "'" not in value else value.replace("'", "\'"))
            sql = sql[:-2]
            self.cursor.execute(sql) #执行SQL
            self.cnx.commit()# 写入操作

SE-0080 数值类型的failable initialize

这是SE-0080带来的改进。例如,之前,当我们把一个Double强制转换成Int的时候,Swift会自动取消小数点后的部分。当我们需要在不同的数字类型之间执行“无损”的精度转换时,这个功能就非常有用,当转型会导致精度丢失的时候,init(exactly:)方法会给我们返回nil。我们通过一个最常见的场景:解析服务器返回的JSON,向大家展示了这个功能的具体用法。

自动推导

Swift 能够根据右边的代码,推导出变量的准确类型
只有相同类型的值才能够进行运算

// 整数默认的类型是 Int
let intValue = 200
// 小数的默认类型是 Double
let doubleValue = 10.5

// 如果要对不同类型的数据进行计算,必须要显式的转换
print(intValue + Int(doubleValue))
print(Double(intValue) + doubleValue)

注意:Swift对类型要求异常严格,任何不同类型的数据不能直接运算(哪怕是Int和Double),不会做一些自动的转换来转换成Double。Swift不存在基本数据类型,Int和Double都是结构体其实,强转用Double(x)完成,或者在定义的时候直接指定变量的类型let x : Double = 10;(很少使用)

这个SQL拼接实现了,如果数据库存在相同数据则 更新,不存在则插入 的SQL语句

SE-0045 Sequence中新添加的两个筛选元素的方法

prefix(while:)drop(while:)是Swift 3.1中新加入到Sequence类型的两个API方法,通过它们,可以帮助我们更有效的编写在Sequence中筛选元素的方法。特别是,如果我们要在一个无限序列中筛选元素,它们就显得更方便了。

二、控制流

具体实现就是第一个for循环,获取key作为MySQL字段名字、VALUES做为SQL的VALUES(拼接成一个插入的SQL语句)

SE-0103 临时转换成escaping的closure

就像SE-0103中描述的一样,在Swift 3里,函数的closure类型参数默认从escaping变成了non-escaping。这很好理解,因为大多数用于函数式编程的closure参数的确都以non-escaping的方式工作。

但这份提议也提到了一个问题,就是有时候,我们需要把non-escaping属性的closure,传递给需要escaping属性closure的函数。什么时候需要这种场景呢?也许你在其他地方看到的解释是:这是一个不太常见的用法。

if

  • Swift 中没有 C 语言中的非零即真概念
  • 在逻辑判断时必须显示地指明具体的判断条件 true / false
  • if 语句条件的 () 可以省略
  • 但是 {} 不能省略
let num = 100

if num > 10 {
    print("大 (num)")
} else {
    print("小 (num)")
}

第二个for循环,实现了 字段名 = VALUES的拼接。

SE-0141 通过available约束Swift版本

虽然之前我们可以通过#if这样的形式达到版本控制的目的,但如果我们用这样的方式编写程序库,就会有一个不太方便的地方。编译器要为它支持的每一个Swift版本都独立编译一遍。于是,如果在一个Swift ABI累积性更新之间兼容了多个Swift版本,那么携带这段时间编写的程序库就是一个比较笨重的事情。一个更好的办法,当然应该是只编译一次,然后在生成的程序库包含每个API可以支持的Swift版本。

为此Swift 3.1中,对@available进行了扩展,我们不仅可以用它来约束操作系统,还可以指定Swift的版本。

三目

  • Swift 中的 三目 运算保持了和 OC 一致的风格
  • 提示:以下代码,可以按 cmd + shift + y,打开控制台,查看输出结果
num > 10 ? print("大 (num)") : print("小 (num)")

或者

num > 10 ? print("大 (num)")  : () 
这样就对后面的不作处理。
() 表示空执行。

和第一个for循环的中的sql就组成了 insert into  XXXXX   on duplicate key update 这个。存在则更新 不存在则插入的SQL语句。

SR-1009 使用具象类型约束泛型参数

在Swift 3.0中,如果我们要为某个特定类型的Optional添加extension,不是一件太容易的事情。我们得通过用protocol约束一个类型相同的computed property来模拟某个具象类型的约束。但在Swift 3.1里,这个缺陷被弥补了,我们不仅可以对泛型参数使用protocol进行约束,还可以使用具象类型作为类型约束,这有点儿像C++泛型中的模板偏特化技术。

switch

  • switch 不再局限于整数
  • switch 可以针对任意数据类型进行判断
  • 每一个 case 后面必须有可以执行的语句
  • 不再强制需要 break
  • 如果没有任何需要执行的语句,可以使用 break
    要保证处理所有可能的情况,不然编译器直接报错,不处理的条件可以放在 default 分支中
  • 每一个 case 中定义的变量仅在当前 case 中有效,而 OC 中需要使用 {}
  • 多值 case 可以使用 , 分隔
let scoreString = "优"

switch scoreString {
case "优":
    let name = "学生"
    print(name + "80~100分")
case "良", "中": print("60~80分")
case "差": print("不及格")
default: break
}

switch 的条件判断

  • switch 中可以使用 where 子句判断条件
  • 如果只做条件判断,case 部分可以使用 _ 省略
  • 提示:Swift 中可以使用 _ 忽略任何不关心的内容
let score = 90
switch score {
case _ where score >= 80: print("优")
case _ where score >= 70: print("良")
case _ where score >= 60: print("中")
default: print("差")
}

SR-1446 关于内嵌类型的两种改进

这一部分,我们来聊聊和内嵌类型有关的话题。在Swift 3.1里,内嵌类型有了两方面的改进:

  • 普通类型的内嵌类型可以直接使用其外围类型的泛型参数,此时它仍旧是一个普通类型;

  • 泛型类型的内嵌类型可以拥有和其外围类型完全不同的泛型参数;

for

  • swift取消了i++和++i和传统的for循环
for i in 0...5 {

}

for i in 0..<5 {

}
  • 反序遍历
 for i in (0..<10).reversed() {

}

三、可选项(Optional)

简要

(1)定义变量时,如果是可选的,表示可以有值,也可以是nil,用“?”
(2)强行解包 “!”,程序员来注意!,并且要少用,可能会崩
(3)最常见的错误:解包的时候发现nil。fatal error: unexpectedly found nil while unwrapping an Optional value
(4)let可选的话,没有默认值,需要赋值。var可选的话,默认值为nil
(5)可选项在参与计算时候必须解包

本文由澳门新葡亰手机版发布于编程,转载请注明出处:Swift基础语法,的一些新特性

上一篇:没有了 下一篇:没有了
猜你喜欢
热门排行
精彩图文