http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 3205|回复: 5

[Swift] 【Swift基础教程】前言

[复制链接]
发表于 2019-1-3 15:38:49 | 显示全部楼层 |阅读模式
    导读

【Swift基础教程】目录   http://www.sufeinet.com/thread-24641-1-1.html

对于已经会使用OC的来说,在学习基本语法之前,可以先简单看一下Swift与OC的不同,如果是新手可直接跳过本篇。

1.注释

OC :  #pragma marks  视图加载完成

Swift: //MARK: 视图加载完成
      //TOOO:设置背景颜色(Xcode 8.0 特有)
       //FIXME:更改头像

2.创建一个视图

OC: [[UIView alloc]initWithxxx:];

Swift: UIView(xxx: )
          类名()== alloc/init 等价

3.类方法

OC: [UIColor redColor];

Swift: UIColor.red

4.访问当前对象的属性,Swift可以不使用self

OC: [self.view addSubview:v]

Swift: view.addSubview(v)

建议:都不用,在编译器提示的时候再添加,会对语境有更好的体会,原因是:闭包(类似 OC block),需要使用self.

5.没有 “;”
“;” 目的分割语句的,在Swift中,默认不需要

6.枚举类型
OC: UIButtonTypeContactAdd
Swift: "."contactAdd

7.监听方法

OC: @selector

Swift: #selector 如果带参数不使用 “:”

8.调试

OC: NSLog

Swift: print(不需要时间,效率比NSLog更高)

9.跟踪函数

OC __FUNCTION__

Swift #function

10.变量与常量

1)关于常量let和变量var的选择:

不可变的会更加安全,开发时,通常使用let,在需要改变的时候,再改成var

2) 如果一个变量从未被改变,会提出警告

//Variable 'x' was never mutated; consider changing to 'let' constant
          //变量x从来没有被修改,建议使用let
3) 修改视图属性,依然使用常量

let v = UIView()

//仅仅修改v的属性,并没有修改v的指针地址
   v.backgroundColor = UIColor.redColor()      

4) 如果需要指定变量和常量的类型,可以使用 let x:类型 = 值

提示:在Swift开发中,极少使用直接指定类型,通常都是自动推导

5) 定义变量var,定义后可以修改;常量let,定义之后不可修改
   自动推导变量和常量的类型会根据右侧的代码的执行结果,推导对应的类型
  热键:option + click 查看类型
  整数:Int 与OC中的NSInteger类似
  小数:Double 与OC中的CGFloat类似  
6) 在Swift中对类型要求异常严格
  任何不同类型的数据之间,不允许直接运算,不会做默认隐式转化,所有的数据类型确定都要由程序员负责
7) Swift不在基本数据类型,都是结构体

11.可选项 Optional
1)原始的可选项定义(None 没有值 或者 Some某一类值)
  let x:Optional = 10
2)简单的定义  
      
[C#] 纯文本查看 复制代码
  '?'用来定义 y是一个可选项的整数类型[/align]   let y:Int? = 20
    如果不进行初始化会直接报错:
   Constant 'y' captured by a closure before being initialized
         //常量y使用之前必须初始化
   不同类型之间的值不可以直接运算,如果没有值则默认nil,不是任何数据类型,不参与计算,print(x+y)提示错误;
   解决:'!'强行解包,在可选值中选择非空值,如果值初始化为nil,会崩溃
   定义y,没有初始化
        let y:Int?
        给常量设置数值,初始化的工作能做一次
        y = 20
        //两次修改常量会报错
        //y = 3
         var 的可选项默认为nil
         //let 的可选项没有默认值
            var x:Int?
            //输出nil
          x = 10
          x = 100
        //输出可选项100
         print(x)

12. 逻辑分支

1> 简单的分支
  a.条件不需要()
  b.语句必须有{}
  if x < 6 {
  }else {
   }
2>三目(三目语法跟OC一样)
 
[C#] 纯文本查看 复制代码
 x > 5 ? print() : print()[/align]  有时候使用'()'表示空执行
  x > 5 ? print() : ()
3>switch 
 
[C#] 纯文本查看 复制代码
 /*[/align]    1.switch 可以针对任意类型的值进行分支,不在局限整数
     2.switch 一般不需要break
     3.switch 如果多时,使用','
     4.所有的分支至少需要一条指令,如果什么都不干,才使用break
    */
   func  demo(num: String){
       //let num = 10
        switch num {
      ase "10","9":
            print("优")
         case "8":
          break
        default:
         print("一般")
         }
    特殊的使用,不经常出现
    let point = CGPoint(x: 10, y: 10)
            switch point {
            case let p where p.x == 0 && p.y == 0:
                print("原点")
            default:
                print("")
            }

13.可选的判断

1、if let  和 guard let 的技巧:
  使用同名的变量接收者,在后续使用的都是非空值,不需要解包;
  好处:可以避免命名的烦恼
  guard 守卫/守护
  guard let 和 if let 刚好相反
 
[C#] 纯文本查看 复制代码
 if let name = name,age = age {[/align]            //非空的name和age仅在{}有效
            print(name + String(age))
            print("------------")
        }else{
            print("姓名或者年龄为 nil")
        }
  //guard let 守护一定有值,如果没有直接返回
      guard let name = name,age = age else{
            print("姓名或者年龄为 nil")
            return
        }
   //代码执行至此,name和age一定有值
        //通常判断是否有值之后,会做具体的逻辑实现,通常代码多
        //如果用if let 凭空多了一层分支,guard是降低分支层次的办法
        //guard 是Swift 2.0之后推出的
         print(name + String(age))
2、if let/var 连用语法,目的就是判断值
   
[C#] 纯文本查看 复制代码
 //不是单纯的if[/align]  if oName != nil && oAge != nil {
            print(oName! + String(oAge!))
        }
        //if let 连用,判断对象的值是否为nil,{}内一定有值,可以直接使用,不需要解包
        //if var 连用,{}内可以对值进行修改
        if var name = oName,let age = oAge {
              name = "老李"
            //进入分支之后,name 和 age 一定有值,不需要解包
            //name age 作用域仅在{}中
            print(name + String(age))
        }else{
            print("name 或者 age 为nil")
        }
3、??
   ??是一个简单的三目
        如果有值,使用值
        没有值,使用 ?? 后边的值代替
 
[C#] 纯文本查看 复制代码
  //?? 操作符的优先级低 ,在使用的时候最好加上()[/align]   print((x ?? 0) + (y ?? 0))




1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2019-1-3 15:41:26 | 显示全部楼层
教程帖子打不开啊
发表于 2019-1-3 16:07:03 | 显示全部楼层
强烈支持楼主ing……
发表于 2019-1-3 16:59:38 | 显示全部楼层
强烈支持楼主ing……
发表于 2019-1-3 17:08:42 | 显示全部楼层
真是难得给力的帖子啊。
发表于 2019-1-3 17:09:13 | 显示全部楼层
强烈支持楼主ing……
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-4-26 11:22

© 2014-2021

快速回复 返回顶部 返回列表