2016-08-02 21:26:34 Darrenzzb66 阅读数 666
  • 子查询(any、some)

    能熟练使用sql语句对数据库进行增删改查 理解sql注入原理,注重sql安全 熟练使用数据库的几大对象存储过程、存储函数、视图、 触发器等

    27120课时 0分钟 0人学习 赵晓希
    免费试看

一,Optional

在swift中Optional是可选类型,代表可有可无,当我们看到一个方法或者数据类型后面有?时,就代表返回的是一个可选类型。直接打印可选类型会被Optional包裹,在后面加一个!就代表一定有值,而且将其强制解析,去掉Optional包裹。


这样做的目的其实就是安全起见,因为swift是一种安全的非常语言。所以我们在使用前一般都会做判空操作

eg:   if  url  != nil  {

       let request  =  NSURLRequest( URL: url ! )

      }

另外一种就是可选绑定

eg:   if  let urlFinal = url {

       let request  =  NSURLRequest( URL: urlFinal )

      }

以上方法就是先将url中的值取出来赋值给urlFinal ,然后判断是否为空,不为空就进入{    }  里面执行代码。因为在swift中条件语句的值只能是Bool,取值只能为ture/false

二,闭包

在swift中闭包其实就是OC中的block

格式为  {   ()-> () in 

               ....

            }

第一个 ()为形参,第二个 ()为返回值,in是用于区分返回值和执行代码,如果闭包没有参数和返回值,那么in和in之前的东西都可以删除

定义一个闭包:

var  finished: () -> ()?     //这种写法是错误的,因为他代表的是返回值为可选类型

var  finished:( () -> () )?  //正确,代表闭包为可选类型


2016-03-31 14:44:22 junk1357 阅读数 8759
  • 子查询(any、some)

    能熟练使用sql语句对数据库进行增删改查 理解sql注入原理,注重sql安全 熟练使用数据库的几大对象存储过程、存储函数、视图、 触发器等

    27120课时 0分钟 0人学习 赵晓希
    免费试看

最近一直在纳闷如何去判断AnyObject类型为空,像以前oc中有nil进行判断就可以了,但是它却不能使用此方法进行判断;

而我在很多数据请求的时候又需要使用AnyObject类型作为返回值,研究了很久都没找到有效的判断方式,今天仔细研究了下它的数据结构,终于找到了方法;

首先来分析下它的数据结构,下面分有数据和没有数据的时候进行区分:

1、有数据的时候:

▿ Optional<AnyObject>

  ▿ Some : 2 elements

    ▿ [0] : 15 elements

      ▿ [0] : 2 elements

        - .0 : systime

      ▿ [1] : 2 elements

        - .0 : contxt

    ▿ [1] : 15 elements

      ▿ [0] : 2 elements

        - .0 : systime

      ▿ [1] : 2 elements

        - .0 : contxt { ... }


2、没有数据的时候:

 Optional<AnyObject>

  - Some : <null>


从上面的两种情况就可以看出来在有数据的时候它是采用了计数的方式进行存储的,有点像数组;那么此时应该就可以类似于数组判断元素个数的方式调用count函数进行判断是否存在元素;

而从没有值的情况就会发现它给出的是<null>,这让我想到了NSNull类,但是我使用这种方式判断的时候也不行,编译都没法通过;


所以综合起来最终的解决方式就是将其当作一个容器来进行处理,容器中存储元素,那么就可以获取容器中元素的个数,若个数为0那么说明容器中不存在任何元素;


最终判断AnyObject为空操作就是依靠count函数即可    AnyObject.count<=0  即表示AnyObject为空

2017-09-05 16:59:05 bitcser 阅读数 7860
  • 子查询(any、some)

    能熟练使用sql语句对数据库进行增删改查 理解sql注入原理,注重sql安全 熟练使用数据库的几大对象存储过程、存储函数、视图、 触发器等

    27120课时 0分钟 0人学习 赵晓希
    免费试看

跟后台交互的时候,经常返回<null>这种

直接用 **  is NSNull  判断就可以了

 

关注IT美学公众号,分享更多知识

2016-01-29 19:47:41 longshihua 阅读数 5434
  • 子查询(any、some)

    能熟练使用sql语句对数据库进行增删改查 理解sql注入原理,注重sql安全 熟练使用数据库的几大对象存储过程、存储函数、视图、 触发器等

    27120课时 0分钟 0人学习 赵晓希
    免费试看

is和as

类型转换 可以判断实例的类型,也可以将实例看做是其父类或者子类的实例。

类型转换在 Swift 中使用 isas 操作符实现。这两个操作符提供了一种简单达意的方式去检查值的类型或者转换它的类型。

直接上代码,首先定义几个类:

//类型的检査与转换
class Fruit{

    let placeOfOriginal: String
    init(placeOfOriginal: String){
        self.placeOfOriginal = placeOfOriginal
    }
}

class Apple:Fruit{

    func desCription(){
        print("苹果的原产地\(placeOfOriginal)")
    }
}

class Orange:Fruit{
 
    func desCription(){
        print("橘子的原产地\(placeOfOriginal)")
    }
}

func testOne(){
    
        //定义了五个水果
        let apple1 = Apple(placeOfOriginal: "北京")
        let apple2 = Apple(placeOfOriginal: "上海")
        let apple3 = Apple(placeOfOriginal: "深圳")
        let orange1 = Orange(placeOfOriginal: "成都")
        let orange2 = Orange(placeOfOriginal: "广州")
        
        let basket = [apple1,apple2,apple3,orange1,orange2]
        
        for fruit in basket{
        
            //1:如果想要使用子类Apple和Orange的方法那么久必须使用 as操作符进行类型转换,转换为对应的类型.
            if let apple = fruit as? Apple{
                apple.desCription()
            }else if let orange = fruit as? Orange{
                orange.desCription()
            }
        }
        
        //如果我们想知道篮子里有多少苹果有多少橘子,所以恶魔需要使用is操作符,来挨个检测这些水果类实例,到底是苹果还是橘子.
        var appleCount = 0
        var orangeCount = 0
        for fruit in basket{
            
            //1:如果想要使用子类Apple和Orange的方法那么久必须使用 as操作符进行类型转换,转换为对应的类型.
            if  fruit is Apple{
                 appleCount++
            }else if fruit is Orange{
                 orangeCount++
            }
        }
        
        print("水果篮子里有:\(appleCount)个苹果和\(orangeCount)个橘子")
        //水果篮子里有:3个苹果和2个橘子
 }
总结 is和as的用法:

       is操作符是一个类型检査操作符,在Swift中,对它的定义是:检测一个实例是不是特定类的子类型,如果是,则该操作符返回true,如果不是,则返回false.在使用is操作符时,需要注意:is操作符的左操作数只能是一个父类的实例,而右操作符只能是一个子类类型,不满足该规则的代码会导致编译错误.
        比如:用一个Apple的实例apple1,去看它是不是一个Orange实例,或者使用 apple1实例看是不是Apple的实例: 

       
 
    as操作符是一个类型转换操作符,主要用于实例在子类和父类间的转换.它有两个版本,分别是带问号的版本(as?)和不带问号的版本(as),我们把它们分别称为"as的可选格式"和"as的强制解封格式".其中 as的可选格式返回一个子类的可选类型,成功时该可选类型的值为子类实例,失败时该可选类型的值为nil.而as的强制解封格式则会强制执行转换操作,如果失败将会导致运行时错误,这里需要注意:
        1:如果你不是确定你的类型转换是否成功,务必使用as?(as的可选格式),然后通过nil判断来检査成功与否.
        2:如果你非常确定这个转换一定成功,就使用 as(as的强制解封格式),但要明白使用as的强制解封格式是需要承担代价的.
        在使用 as操作符时,需要注意可选格式和强制解封格式在使用上的差别,其中 as?操作符严格要求坐操作数只能够为严格父类型的实例,而右操作数只能是为严格子类型,而 as操作符的限制缺相对要宽松.

AnyObject和Any

Swift为不确定类型提供了两种特殊类型别名:

AnyObject可以代表任何class类型(即类类型)的实例。
Any可以表示任何类型,包括方法类型(function types)。用来修饰任意类型的实例,包括AnyObject修饰的实例.


注意:
只有当你明确的需要它的行为和功能时才使用Any和AnyObject。在你的代码里使用你期望的明确的类型总是更好的.

AnyObject类型

//AnyObject任意实例类型
class Evil{

    var name = ""
}

class Angel{

    var name = ""
}

class Folk{

    var name = ""
}
func testTwo(){
      
        var hiter = Evil()
        hiter.name = "希特勒"
        
        var chenGuanBiao = Angel()
        chenGuanBiao.name = "陈光标"
        
        var laoMa = Folk()
        laoMa.name = "老码"
        
        var buddhism = [String:AnyObject]()
        buddhism = ["悟空":hiter, "悟静": chenGuanBiao, "悟能":laoMa]
        
        for (key, value) in buddhism{
        
            if let v = value as? Evil{
             
                print("恶魔:\(v.name) 法号:\(key)")
            }else if let v = value as? Angel{
                
                print("天使:\(v.name) 法号:\(key)")
            }else if let v = value as? Folk{
            
                print("农民:\(v.name) 法号:\(key)")
            }else{
            
                print("众生平等,不问背景!")
            }
        }
        
        /*
        
        天使:陈光标 法号:悟静
        恶魔:希特勒 法号:悟空
        农民:老码 法号:悟能
        
        对于佛门我们用名为buddhism的字典,其类型为[String:AnyObject].也就是说佛门谁都可以进,不管你是恶人希特勒还是好人表格还是农民,这些都没有统一的父子类关系,但是都可以放到佛门这个字典里,因为它的类型是AnyObject,但是key是String类型,因为进入佛门的人都要一个法号.比如老码就是悟能.
        在访问字典里的元素的时候,需要分别处理,因为AnyObject没有办法具体到哪个实例.
        */
        
    }

 

Any类型 

func testThree(){
    
       //Any 其实Any是AnyObject的总类,完全覆盖AnyObject.
        var things = [Any]()
        
        func getSalarySummary(month: Int) -> Double{
            
            return Double(month * 1000)
        }
        
        things.append(0)
        things.append(0.0)
        things.append(50)
        things.append(4.1527)
        things.append("hello jack")
        things.append((3.0,6.0))
        things.append(getSalarySummary)
        
        for thing in things{
        
        switch thing{
            
            case 0 as Int:
                       print("这是一个整形!")
            case 0 as Double:
                       print("0是一个Double类型!")
            case let someInt as Int:
                       print("\(someInt) 是一个整形!")
            case let someDouble as Double where someDouble > 0:
                       print("\(someDouble)是一个正数!")
            case is Double:
                       print("其他Double型!")
            case let someString as String:
                       print("字符串\(someString)型")
            case let (x,y) as (Double, Double):
                       print("坐标(x,y)是\(x),\(y)")
            case let getSalarySummaryFunction as Int -> Double:
                       print("总收入为: \(getSalarySummaryFunction(12))")
            default:
                      print("其他值!")
            }
        }
        
        /*
        
        这是一个整形!
        0是一个Double类型!
        50 是一个整形!
        4.1527是一个正数!
        字符串hello jack型
        坐标(x,y)是3.0,6.0
        总收入为: 12000.0
        
        注意:
        在一个switch语句的case中使用强制形式的类型转换操作符(as, 而不是 as?)来检查和转换到一个明确的类型。在 switch case 语句的内容中这种检查总是安全的。
        */
    }



2018-01-15 10:17:27 mn704058053 阅读数 0
  • 子查询(any、some)

    能熟练使用sql语句对数据库进行增删改查 理解sql注入原理,注重sql安全 熟练使用数据库的几大对象存储过程、存储函数、视图、 触发器等

    27120课时 0分钟 0人学习 赵晓希
    免费试看

//
//  ViewController.swift
//  007-可选项的判断
//
//  Created by 庄壮勇 on 2018/1/2.
//  Copyright © 2018年 Personal. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        demo4(name: "老王", age: 18)
    }

    func demo4(name: String?, age: Int?) {
       
        if let name = name,let age = age {
           
            // 非空的 name 和 age 仅在{}内有效!
            print(name + String(age))
            print("----------")
        }
       
       
        // guard let & if let 的技巧
        // 使用同名的变量接收值,在后续使用的都是非空值,不需要解包
        // 好处,可以避免起名字的烦恼!
        guard let name = name,let age = age else {
            print("姓名或者年龄为nil")
            return
        }
        print(name + String(age))

    }
   
    // MARK: - guard 守卫/守护
    // guard let 和 if let 刚好相反
    func demo3() {
        let oName: String? = "老王"
        let oAge: Int? = nil
    
        // guard let 守护一定有值,如果没有直接返回
        guard let name = oName,let age = oAge else {
            print("姓名或者年龄为nil")
            return
        }
       
        // 代码执行至此,name 和 age 一定有值!
        // 通常判断是否有值之后,会做具体的逻辑实现,通常代码多!
        // 如果用if let 凭空多了一层分支,guard 是降低分支层次的办法
        // guard 的语法是Swift2.0推出的!
        print(name + String(age))

    }
   
   
    // MARK: - if let / var 连用语法,目的就是判断值
    // 不是单纯的if
    func demo2() {
        let oName: String? = "老王"
        let oAge: Int? = 10
        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")
        }
    }
   
    // MARK: - ??
    func demo1(x: Int?,y: Int?) {
        /**
          ?? 是一个简单的 三目
          - 如果有值,使用值
          - 如果没有值, 使用?? 后面的值替代
         */
        print((x ?? 0) + (y ?? 0))
       
        let name: String? = "老王"
        print((name ?? "") + "你好")
        // ?? 操作符号的优先级'低',在使用的时候,最好加上()包一下
        print(name ?? "" + "你好")
    }
    func demo(x: Int?,y: Int?)  {
        // 1.强行解包有风险
        // print(x! + y!)
        // 2.使用if判断
        // 但是: 如果直接使用if,一不小心,会让代码很丑陋
        if x != nil && y != nil {
            print(x! + y!)
        } else {
            print("x 或者 y 为nil")
        }
    }
}