swift学习?和!的使用&block和swift的闭包的区别&swift和oc中构造函数的区别&Extra argument 'method' in call

学了两天swift4发现它已经不是从前的那个swift的了,其中很多调用和写法都发生很大的变化,比如GCD的调用,闭包的一些使用,接下来的一段时间我会把,所碰到的问题和修改先列在这,由于时间比较紧,所以后面有时间了在做排版整理。看官先将就一些。

语言变化和一些坑的总结

第一点

//Function types cannot have argument labels; use '_' before 'index' insert '_'

报错重现:

func scrollView(frame: CGRect, numberOfLabel: () -> Int, labelOfIndex: (index: Int)->UILabel) -> UIScrollView

解决方案

// 此处要注意的是labelOfIndex这个闭包,参数部分按之前的写法是在此处声明形参和类型,按最新的写法是在用的时候再去声明,此处之申明类型

func scrollView(frame: CGRect, numberOfLabel: () -> Int, labelOfIndex: (Int)->UILabel) -> UIScrollView {

// code

}

let labelOfIndex = { (index: Int) -> UILabel in

            let label = UILabel()

            label.text = "标签 \(index)"

            label.sizeToFit()

            

            return label

        }

        // self.可以不用写

        view.addSubview(scrollView(frame: rect, numberOfLabel: numberOfLabel, labelOfIndex: labelOfIndex))

对闭包做一点补充说明:

oc的block和swift的闭包的区别

为什么在oc中叫block,在swift就要改成叫闭包呢?

是因为swift里的闭包结构发生变化了,在oc中block是一个匿名函数指针,在swift里函数是特殊的闭包。闭包的范围更大。

 

第二点

GCD swift4的写法:

func loadData() {

        DispatchQueue.global().async { () -> Void in

            print("玩命加载中 \(Thread.current)")

            

            DispatchQueue.main.async {

                print("回调 \(Thread.current)")

            }

        }

    }

 

第三点  在swift中?和!的使用

?代表可有可无,:

!强行解包,代表肯定是有值的,在代码执行的如果为nil程序会蹦到!的地方。便于我们查找问题。

写个例子说明一下

```

weak var weakSelf = self

// ?代表可选解包,如果self被释放了,就不会向对象发送getter的消息,这种方式更安全

print(weakSelf?.view)

// !代表强行解包,如果self被释放了,强行解包会崩溃

print(weakSelf!.view)

```

那问题就来了,既然有了如此安全的?,那为什么还会有!的存在呢?

再看一个例子

```

let x: Int? = 10

let y: Int? = 40

print(x! + y!)

```

!:强行解包,因为需要计算,可选项是不可以参与计算的

 

吐槽:

在当初刚开始学习oc的时候,代码只要以报错就蹦到main函数,内心很绝望啊,到是告诉我哪错了呀,后面随着不断的学习也了解到是因为oc是运行时的一个机制,它是动态转发消息,在转发消息的时候崩掉了,就蹦到main函数了,然后给一堆错误提示让我们自己去找。

第四点  swift中重载和重写

在swift的时候了解到,在swift的中是支持重载的,这也是很多面向对象的语言所具备的功能。

要注意的是重载和重写是不一样的哦,新接触的开发的同学要注意了,

重载是函数名一样,参数的类型和数量不同。重写是重写父类的方法,覆盖父类的方法,比如见得最多的override init()重写构造函数。

第五点  swift和oc中构造函数的区别

1. swift的中构造函数支持重载,oc是不支持的

2. 构造函数在执行的顺序不同,swift是先给本类分配空间,初始化值,然后在调父类的构造函数。oc是相反的

 

第六点 Extra argument 'method' in call

或者 Extra argument 'XXXX' in call 类似的错误,是你代码写错了,但是不一定是它报错的位置,如果实在找不到哪里写错了,可以把报错的方法重新写一遍就好

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值