2018-02-09 14:54:36 ZY_FlyWay 阅读数 1604

Swift 4.0访问权限关键字

    目前有 open  public  internal  fileprivate  private 这五个访问权限,都可以修饰属性和方法。下面通过例子来分析五个访问权限的使用。


不同点分析:

  • 是否可以被子类继承访问
  • 同文件不同类下是否可以访问
  • 不同文件是否可以被访问
  • 不同组件下是否可以被访问

1、private

被private修饰的属性和方法  ,只可以在该类下使用(extension可使用,因为是同类。)

例如:下面图片,即使在同文件下不同类也是不能调用的,继承的话子类也不能调用。



2、fileprivate

      fileprivate和private 想比较一下,区别一目了然,相同文件下是可以调用的,其他和private一样。

 

3、internal 

 

      默认权限,如果项目没有进行组件化开发,整个APP项目内都是可以访问的。

 

4、public

 可以被任何人访问,但是在其他module中不可以被继承和重写,在当前module内可以


5、open  


  最高权限,可以被任何module和文件访问和继承重写


2015-09-23 21:10:09 Leexianke 阅读数 310
    正如所有语言一样,swift中也存在大量的关键字用于区别不同的功能代码,本文主要介绍swift的关键字的含义及注意点。本文目录:
    1.var 与 let
    2.override,private与public
    3.
    4.
    5.
    6.
一  var 与 let
    swift中极度精简变量的声明,var表示可变,let表示不可变。而变量的类型由初始化时赋予的值的类型决定。如果初始值的类型不明显或者未赋予初始值,那么可以加冒号和类型加以区分,如:
      let name:String?
     注意在swift2.0中如果一个变量在一个事件循环中没有改变其值,而你把它声明成let,编译器会报错,因为这不需要。而把你觉得不可变的都应声明成let,因为这样可以在改变其值时得到警报!

二  override,private与public
    override本来与后两者并不冲突,但是同样可以修饰函数的,就放在一起了。首先注意override在swift中是必要的,就是说如果覆写父类的方法一定要声明。而且,如果父类中不存在此方法亦会报错。
    private用于声明私有方法和私有变量,所谓私有方法是指只有本类才可调用。我曾经用performSelector调用了非本类的private方法,这样是找不到此方法的。要注意!
    public是默认值,如果不做任何声明即默认公开。但是如果你写framework给他人使用时需要声明。
(未完待续)

   
2018-03-15 09:20:52 qq_35612929 阅读数 294

final 关键字


很多语言都有final这个关键字,Swift中,这个关键字可以用来修饰 class、func、var。表示被修饰的对象无法被继承。

2016-12-21 15:37:08 timtian008 阅读数 1106

下面这些被保留的关键字不允许用作标识符,除非使用反引号转义,具体描述请参考 标识符。除了 inout、var 以及 let 之外的关键字可以用作某个函数声明或者函数调用当中的外部参数名,不用添加反引号转义。

● 用在声明中的关键字: associatedtype、class、deinit、enum、extension、func、import、init、inout、internal、let、operator、private、protocol、publicstaticstruct、subscript、typealias以及 var。
● 用在语句中的关键字:breakcasecontinuedefault、defer、doelse、fallthrough、for、guard、ifin、repeat、returnswitch、where以及 while。
● 用在表达式和类型中的关键字:as、catch、dynamicType、falseis、nil、rethrows、super、self、Self、throw、throws、truetry、#column、#file、#function以及 #line。
● 用在模式中的关键字:_。
● 以井字号 (#) 开头的关键字:#available、#column、#else#elseif、#endif、#file、#function、#if#line 以及 #selector。
● 特定上下文中被保留的关键字: associativity、convenience、dynamic、didSet、final、get、infix、indirect、lazy、left、mutating、none、nonmutating、optional、override、postfix、precedence、prefix、Protocol、required、right、set、Type、unowned、weak以及 willSet。这些关键字在特定上下文之外可以被用做标识符。
以下符号被当作保留符号,不能用于自定义运算符: (、)、{、}、[、]、.、,、:、;、=、@、#、&(作为前缀运算符)、->、`、?、!(作为后缀运算符)。
2018-01-17 18:20:26 dangyalingengjia 阅读数 2410

最近完成了公司项目由Swift3.2 -> Swift4的升级工作,记录一下。
这里将Swift4较Swift3.2的新特性以及必要的处理列出来:

1,private关键字作用域扩大到整个文件。
说明:可以用private替代fileprivate了
处理建议:考虑到private没有向后兼容性(在swift3.2及之前版本无法在extension中使用),所以建议保留原来的fileprivate关键字。

2,扩展Key Path的写法
说明:
Swift 3.2中Key Path写法:

class Kid: NSObject {
     var nickname: String = ""
     var age: Double = 0.0
     var friends: [Kid] = []

    init(nickname: String, age: Double) {
        self.nickname = nickname
        self.age = age
    }
}

class ViewController {
    func testKeyPath() {
        var ben = Kid(nickname: "Benji", age: 5.5)
        let kidsNameKeyPath = #keyPath(Kid.nickname)
        ben.setValue("Ben", forKeyPath: kidsNameKeyPath)
    }
}

Swift4中增加的写法:

func testKeyPath() {
    let ben = Kid(nickname: "Benji", age: 5.5)
    let kidsNameKeyPath = \Kid.nickname
    ben[keyPath: \Kid.nickname] = "Ben"
}

处理建议:代码可以不用改,见了\的用法认识就可以。

3,关于@objc的使用
说明:
Swift编译器会推断需要暴露给OC的函数(所有继承于NSObject的类的函数),并为其增加@objc关键字修饰。这样做的问题有:
(1)增大二进制文件大小。
(2)程序员不知道编译器何时会推断为需要增加@objc

用Swift4编译代码时,在check dependencies这一步,提示:


The use of Swift 3 @objc inference in Swift 4 mode is deprecated. Please address deprecated @objc inference warnings, test your code with “Use of deprecated Swift 3 @objc inference” logging enabled, and then disable inference by changing the “Swift 3 @objc Inference” build setting to “Default” for the “XXX” target.


按照提示将xxx target - build setting- Swift 3 @objc Inference 由On改为Default之后,#selector的函数以及dynamic变量如果没有用@objc修饰的话,会报错:
Argument of ‘#selector’ refers to instance method ‘xxx()’ that is not exposed to Objective-C
给#selector中的函数和dynamic变量前面加上@objc就可以了。
处理建议:必须按照说明中的方法修改,否则编译报错。

4,结构体UILayoutPriority中的运算符重载被删除
说明:
setContentCompressionResistancePriority(_:for:)等方法的参数类型是结构体UILayoutPriority。
Swift3.2写法:

self.detail1Label.setContentCompressionResistancePriority(UILayoutPriorityDefaultLow-10, for: UILayoutConstraintAxis.horizontal)

self.detail2Label.setContentHuggingPriority(UILayoutPriorityRequired, for: UILayoutConstraintAxis.horizontal)

Swift4写法:

self.detail1Label.setContentCompressionResistancePriority(UILayoutPriority(rawValue: UILayoutPriority.RawValue(Int(UILayoutPriority.defaultLow.rawValue)-10)), for: UILayoutConstraintAxis.horizontal)

self.detail2Label.setContentHuggingPriority(UILayoutPriority.required, for: UILayoutConstraintAxis.horizontal)

处理建议:必须按照说明中的方法修改,否则编译报错。

5,NSAttributedString相关OC的全局变量无法在Swift4中继续使用
说明:
看下这段代码:

let textMATString = NSMutableAttributedString(string: "abcd")
let titleOptions: [String : Any] = [NSFontAttributeName : UIFont.systemFont(ofSize: 12)]
textMATString.addAttributes(titleOptions, range: NSMakeRange(0, 4))

这段代码在Swift3.2上编译无问题,但是在Swift4上报错:
Cannot convert value of type ‘NSAttributedStringKey’ to expected dictionary key type ‘String’
查了SDK,NSFontAttributeName是OC中的全局变量名,在Swift中相应的是NSAttributedStringKey.font。看来Swift4中严格限制了OC中的全局变量在Swif4中的使用。

以下是Swift4中的写法:

let titleOptions: [NSAttributedStringKey : Any] = [NSAttributedStringKey(rawValue: NSAttributedStringKey.font.rawValue) : UIFont.systemFont(ofSize: 12)]

处理建议:必须按照说明中的方法修改,否则编译报错。

6,更严格的Block参数检查
说明:
Swift4中对Block中参数的个数进行了严格的检查,即使是用_表示的未使用参数,个数也要严格对应才能编译通过。
例如,Kingfisher中的Block定义

DownloadProgressBlock = ((_ receivedSize: Int64, _ totalSize: Int64) -> ())

使用方式:

KingfisherManager.shared.retrieveImage(with: url, options: options, progressBlock: {_ in}, completionHandler: { [weak self] (image, error, cacheType, url) in

上面的代码Swift3.2中编译正常,Swift4中报错:
Cannot convert value of type ‘(_) -> ()’ to expected argument type ‘DownloadProgressBlock?’ (aka ‘Optional<(Int64, Int64) -> ()>’)
修正方式:

KingfisherManager.shared.retrieveImage(with: url, options: options, progressBlock: {_, _ in}, completionHandler: { [weak self] (image, error, cacheType, url) in
or
KingfisherManager.shared.retrieveImage(with: url, options: options, progressBlock: nil, completionHandler: { [weak self] (image, error, cacheType, url) in

处理建议:使用时需要符合block中参数的个数

7,AVCaptureDevice、AVCaptureSession、AVMediaType等类中的全局变量无法在Swift4中继续使用
说明:
会有编译error。
处理建议:
消去编译error,工作并没有完成。你如果测试一下你的Barcode功能的话,你会发现原来运行的完好的扫码功能,扫不出来结果了。原因是回调函数不被调用了:

func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!)

苹果大大真厉害,原来是偷偷的将回调函数改为了,还有没有测试人员了??!!:

func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection)

修改了函数名后,好用了。参考:
https://stackoverflow.com/questions/46011211/barcode-on-swift-4/46027337#46027337

在参考文档中讲解的下面的功能点经证实在Swift3.2就已经有了,并不是Swif4新增加的功能:
1,有些教程中说“类型和协议的组合类型”是Swift4中新增加的特性,这是错误的,在Swift3.2就已经有个这个特性,在代码中指定类型为(类型 & 协议)是不会报错的。
2,用”“”控制字符串可以实现多行字符串字面量。
3,对于字典集合的顺序初始化,过滤等内容。

参考:
1,最全的 Swift 4 新特性解析 https://www.jianshu.com/p/c4f5db08bcab
2,What’s New in Swift 4? https://www.raywenderlich.com/163857/whats-new-swift-4

swift3.0函数

阅读数 195

Swift4.0复习类

阅读数 0

没有更多推荐了,返回首页