您的位置:首页 > 移动开发 > Swift

[绍棠_Swift] Swift3.0笔记整理

2017-08-01 17:42 351 查看

1.在swift3.0中方法的返回值必须要有接收,否则会报警或者报错,即使提醒开发者需要接收方法的返回值,当我们不需要接收返回值时,我们有两种方法告诉编译器此方法可以不用接收方法的返回值


override func viewDidLoad()

        { super.viewDidLoad()

            // 方式一:
需要@discardableResult

            let ca =
function()

            ca.sum(a: 10, b: 10)
// 这里会有一个警告,提示开发者需要接收返回值

            // 方式二:
不需要@discardableResult

            let
_ = ca.sum(a: 10, b:10)

        }

        struct function {

            @discardableResult

            func sum(a:
Int, b: Int) ->
Int

            {

                return a + b

            }

        }

/*

         注意这里我们使用了struct,
我们来看看它和Class的区别

         在Swift中struct与Class非常相似,
但是他们还是有点区别的

         区别一: struct没有继承功能,但是class是可以继承的

         区别二:
区别体现在内存上, struct是通过值传递的,而class是通过
引用来传递的

 */


2.自定义协议时,也有一些发生变化

在Swift3.0之前,定义协议只需要在协议(protocol)前面添加@objc即可,但是在Swict3.0中定义协议除了在协议前面加@objc外,在协议中的方法的修饰符前也要加@objc

@objc pritocol SinaHomeDelegate {

            @objc
optional func func1()

            func func2()

        }


3.一些Swift3.0的变化


//  <一>

        // (1), 去掉类型前缀

        let url =
URL(string:"www.baidu.com")
// 以前的NSURL变成了URL

        let data =
Data()
// 以前的写法: let data = NSData(),显然现在的更加简洁

     
12175
  // (2), 可读性更好了

        let isFileURL = url?.isFileURL
// 以前的写法是url?.fileURL,
现在的写法可读性更好了

       
// (3), 移除多余的动词,其他名词,介词修饰语,显然这样更加简单,简洁,易读

        var array = [1, 2, 3, 4]

        array.append(contentsOf: [4, 5, 6])
// 以前的写法: array.appendContentsOf([4, 5, 6])

        array.remove(at: 0)
// 以前的写法: array.removeAtIndex(0)

        // (4), 在Swift3.0中尽量消除重复,可以减少语义歧义
例如:

        btn.backgroundColor = UIColor.red()
// 以前的写法: btn.backgroundColor = UIColor.redColor()

        //(5),枚举的成员首字母变成了小写

        label.textAlignment = .center //
以前的写法: label.textAlignment = .Center

        // 如果按钮的状态是普通状态时,normal可以省略变为()

        let btn =
UIButton()

        btn.setTitle("按钮",
for: UIControlState())
// Nomal状态可以省略Normal

        btn.frame =
CGRect(x: 100, y: 100, width: 50, height: 50)
// 不在是CGRectMake....

        btn.backgroundColor = UIColor.red()
// 不在是redColor()

        view.addSubview(btn)

        // <二>

        // (1)设置控件位置

        btn.frame =
CGRect(x: 10, y: 10, width: 100, height: 100)

        // (2)GCD也有变化

        DispatchQueue.global().async {

            //do something

           
//异步返回主线程,同步容易造成线程卡死

            DispatchQueue.main.async {

                //do something

            }

        }

        // GCD延迟方法

        DispatchQueue.main.asyncAfter(deadline:
DispatchTime.now() + 5) {

            print("----延迟函数-----");

        }

        // (3)Swift3.0通知的变化

        NotificationCenter.default.addObserver(self, selector:
#selector(HomeViewController.loadDatas), name:Notification.Name("loadData"),
object: nil)

        // (4)新的浮点型协议, Float, Double, CGFloat使用了新的协议,主要是提供了IEEE-754标准的属性和方法

        let a = 2 
Float.pi
// 以前的写法: let a = 2  M_PI //
上面的写法可能还没有以前的写法好读好看,所以下面这种写法是推荐写法,简洁易读

        let a = 2.0 * .pi
// 这样的写法主要是取决于前面的是否是浮点类型,
如果是后面的Float可以省

        // (5)获取沙盒路径的方法

        NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory,
FileManager.SearchPathDomainMask.userDomainMask,
true).last


4.Swift3.0关键字的变化


private和fileprivate

private: 私有属性和方法,仅在当前类中可以访问,不包括分类;
fileprivate: 文件内私有属性和方法,仅在当前文件中可以访问,包括同一个文件中不同的类。
public和open

在Swift2.3中,pubic有两层含义:
这个元素可以在其他作用域被访问
这个元素可以在其他作用域被继承或者override

继承是一件危险的事情。尤其对于一个framework或者module的设计者而言。在自身的module内,类或者属性对于作者而言是清晰的,能否被继承或者override都是可控的。但是对于使用它的人,作者有时会希望传达出这个类或者属性不应该被继承或者修改。这个对应的就是 final。

final的问题在于在标记之后,在任何地方都不能override。而对于lib的设计者而言,希望得到的是在module内可以被override,在被import到其他地方后其他用户使用的时候不能被override。

这就是 open产生的初衷。通过open和public标记区别一个元素在其他module中是只能被访问还是可以被override。

在Swift3.0中

public表示当前类、属性或者方法只能在当前module内被继承或者override,在当前module意外只能被访问;

open表示当前类、属性或者方法可以在任何地方被继承或者override;

final是一个辅助修饰词,表示当前类、属性或者方法在任何地方都只能被访问,不能被继承或者override;

internal表示默认级别。

总结

Swfit3.0中,访问控制权限由高到低依次为:open、public、internal(默认)、fileprivate,private。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  swift