Swift 难点

关于Swift的闭包,尾随闭包,Swift 中类型检测使用关键字is,类型转换使用关键字as。Any类,和AnyClass和字典,字符串的方法,直接copy自己写的demo!注释比较详细,有兴趣学习的可以直接copy!

import UIKit
//block 定义,block 是一种数据类型在OC里面,这里也是一样,名字 BlockTarget(参数)(back)
typealias BlockTarget = (String)->(Void)
typealias Block = ()->(Void)
class ViewController: UIViewController {

var blockTarget:BlockTarget?
var blockAction:((String) -> (Void))?

// var blockclick = (()->(Void)).self

override func viewDidLoad() {
    super.viewDidLoad()
    var but:UIButton = UIButton.init(frame: CGRect.init(x: 0, y: 200, width: 100, height: 200))
    but.backgroundColor = UIColor.red
    but.addTarget(self, action: #selector(blockself), for: UIControlEvents.touchUpInside)
    self.view.addSubview(but)
    
    
    /*
     *-----以下都是接触比较少的语法对于纯IOS程序员来说----
     *-----------我会尽量我把知道的注释详细的-----------
     */
    
    for index in 1...5{
        print("index = \(index)")
        //从1到5 循环
    }
    //这是一个字典
    let dic = ["string":1.2,"ant":2.2,"cat":3.2]
    for (j,z)in dic{
        //系统自动找出键值对。注意:但是定义的时候让系统知道数据类型,键值对要一致!不一致会被设成any类型,这个类型后面我慢慢解刨
        print(z)
        
    }
    //要定明白数据类型,如果是其他的数据类型的话就要定义any类型

// let dic1 = ["s":3,"s":"2.2","f":2.2]
// for (k,l)in dic1{
//
//
//
// }
// let dic2:Any = ["s":3,"s":"2.2","f":2.2]
//
// for (a,v) in dic2{
//
// print("a = (a)")
//
// }

    /**
     *1.两个泛型类型,在数组和字典里面怎么应用?
     *2.元祖是否就是数组?
     *3.
     */
    // <N>可变的类型,(numbers:N...)可变参数,可变参数可以接受零个或多个值,局部函数
    func ShowNumber<N>(numbers:N...){
        
        for i in numbers{
            
            print(i)
        }
        
    }
    ShowNumber(numbers: 1,2,3,4,5,6,7,8,9,10)
    func showmtable<S>(number:S)->Int{
        //如果指定了,数据类型就要强转下
        return number as!Int
        
    }
   let b = showmtable(number: 1)
    print("b = \(b)")
    //MARK
    /*
     闭包的语法格式
     1 以下定义了一个接收参数并返回指定类型的闭包语法:
     {
     (parameters) -> return type in
     statements
     }
     
     2 尾随闭包
     (parameters) -> return type in {
     statements
     }
     */
    //fun studname()->()   --- { (parameters)->return type in statements    }
    let Studname = {
        ()->() in print("swift 闭包")
        
    }
       Studname()
    let studname2 = {
      print("Swift 尾随闭包")
    }
    
    studname2()
    //闭包形式接受两个参数并返回布尔值
    let divide = {
        (val1:Int,val2:Int)-> Int in
        let Value = val1/val2
       return Value
        
    }
    let result = divide(10,20)
    print(result)
      //Sort 函数
    //Swift 一建搞定
    let Name = ["AH","AS","D","S","BE"]
    let reversed = Name.sorted()
    print(reversed)//直接返回一个数组
    // 尾随闭包,即{}部分放在()之后。不知道是有啥作用
    
    // 捕获值,函数里面嵌套函数,返回的是一个方法
    func makeINcrementor(forIncrement Amount:Int)->()->Int{
        var RuningTotal  = 0
        func incrermentor()->Int{
            
            RuningTotal += Amount
            print("runingTotal = \(RuningTotal)")
            return RuningTotal
            
        }
        return incrermentor
        
    }
    let rescrrsed05 = makeINcrementor(forIncrement: 10)
    print(rescrrsed05)
    //打印是(Function),返回一个方法给你。。!
    
//block  的应用,
    /*步骤
     *1.定义block类型!typealias BlockTarget = (String)->(Void)
     *((String) -> (Void))?
     *2.现在方法 {ss:string}->() in
     *3.调用block("字符串")
     */
    self.blockAction = {
        (ss:String)->() in
        print(ss)
    }
    
    class Marks{
        var Chinese:String
        init(CHinese:String) {
            self.Chinese = CHinese;
        }
        
        
        
    }
    class grageOne:Marks{
        
        var Maths:String
        init(chainese:String,maths:String) {
            
            self.Maths = maths
            super.init(CHinese: chainese)
        }
        
        
    }
    class GraheTwo:Marks{
        
        var english:String
        init(chinese:String,englich:String) {
            self.english = englich
            super.init(CHinese: chinese)
        }
        
        
        
    }
    //        Swift 中类型检测使用关键字is,类型转换使用关键字as。
    
    let studenMark = [grageOne.init(chainese: "89", maths: "99")
        ,GraheTwo.init(chinese: "wudi", englich: "haha")]
        if studenMark is  GraheTwo{
            print("二年级的成绩")
            
        }else{
            
            print("不是二年级的成绩")
       }
    
    for item in studenMark
    {
        if let xiaoWangMark = item as? grageOne
        {
            print(xiaoWangMark.Chinese)
        }
        else if let xiaoZhangMark = item as? GraheTwo
        {
            print(xiaoZhangMark.Chinese)
        }
    }
    /*
     Any和AnyObject的类型转换
     Swift为不确定类型提供了两种特殊类型别名:
     1 AnyObject可以代表任何class类型的实例。
     2 Any可以表示任何类型,包括方法类型(function types)。
     注意:只有当你明确的需要它的行为和功能时才使用Any和AnyObject。
     */
    var arrayany01 = [Any]()
    print(arrayany01)
    
    arrayany01.append(12)
    arrayany01.append(3.14159)
    arrayany01.append("Any 实例")
    arrayany01.append(grageOne.init(chainese: "hehe", maths: "99"))
    arrayany01.append(GraheTwo.init(chinese: "haha", englich: "88"))
    
    print(arrayany01)
    for  item in arrayany01{
        
        if let itemInt = item as? Int{
         print("整形为\(itemInt)")
            
        }
        
        
        
    }
    func Buttonclock() -> Void {
        print("点击")
    }
    print(Buttonclock())
    let arrayAnyObjct1:Array<AnyObject> = [grageOne.init(chainese: "wudi", maths: "yeshi"),GraheTwo.init(chinese: "78", englich: "92",0), "DevZhang", 30]
    let arrayAnyObject01:Array<AnyObject> = [grageOne(chainese: "86", maths: "66"), GraheTwo(chinese: "78", englich: "92"), "DevZhang" as AnyObject, 30 as AnyObject]
    print(arrayAnyObject01)
    
    let arrayAnyObject02:Array<Any> = [grageOne(chainese: "86", maths: "66"), GraheTwo(chinese: "78", englich: "92"), "DevZhang" as AnyObject, 30 as AnyObject, Buttonclock()]
    print(arrayAnyObject02)
    
}
//这个是类函数,我就不明白了 为什么事件 必须加@objc 要不然没有用。。!报错!
@objc func blockself (){
    self.blockAction!("fake")
    
}




override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    
}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容