美文网首页
关于swift3.0

关于swift3.0

作者: NateLam | 来源:发表于2017-02-03 16:56 被阅读108次

    cocoaPods 引入三方后控制台有警告

    感谢http://www.99css.com/1346/, 虽然人家遇到问题跟我不太一样, 但是解决步骤是一样的

    当使用cocoaPods update之后, 在podFile里面, 先把

    platform :ios, '8.0'
    

    的注释解开,

    然后会看到控制台说

    The OneOneFourSwiftTests [Release] target overrides the ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES build setting defined in Pods/Target Support Files/Pods-OneOneFourSwiftTests/Pods-OneOneFourSwiftTests.release.xcconfig'. This can lead to problems with the CocoaPods installation - Use the$(inherited)` flag, or
    - Remove the build settings from the target.

    解决办法: 点击项目文件 project.xcodeproj,右键显示包内容,用文本编辑器打开project.pbxproj,全局搜索ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES的地方,删除,然后pod install, 世界清静。

    swift平台的著名三方库

    http://www.cnblogs.com/chuange-Strongload/p/5893736.html
    http://www.cocoachina.com/bbs/read.php?tid-1712405.html

    关于图片浏览, 暂时觉得这个还行
    https://github.com/CharlinFeng/PhotoBrowser

    关于多图选择, 暂时觉得这个还行
    https://github.com/mikaoj/BSImagePicker

    如果需要用到桥接文件

    1、选中项目,右键,点击Add Files to xxxx

    2、找到SDWebImage.xcodeproj,并加入项目中

    3、在Build Phases中的Link Binary With Libraries选项卡中,加入ImageIO.framework、libSDWebImage.a

    4、在Build Settings中的Linking选项卡中找到Other Linker Flags,双击右边区域,在弹出的框中点击+按钮,输入-ObjC

    5、建立项目桥文件,输入引用代码#import <SDWebImage/UIImageView+WebCache.h>
    关于桥文件的配置,小伙伴们可以百度一下,不过有个技巧,自己建立个.h和.m文件
    然后复制到Swift项目中,系统会提示,是否自动建立桥文件,点击确定后,XCode会自动帮助我们建立桥文件,而且配置方面也不会出错~~~
    最后,调用下SDWebImage中扩展的方法,运行,成功,Over

    关于一些语法

    if后面不用加圆括号

    判断字符串是否相同直接用==即可

    //OC: [self class]
    //Swift 本类类名.self

    注意一下设置navigationItem怎么写

     self.navigationItem.backBarButtonItem = UIBarButtonItem.init(image: UIImage.init(named: "navi_back"), style: UIBarButtonItemStyle.plain, target: self, action: #selector(back(btn:)))
    

    方法实现的不太确定, 暂时不写

    创建pch文件

    还想要习惯性创建OC时代的pch文件? 这玩意没用啦!

    但是, 新建Swift File 文件, Foundation改为UIKit, 一样可以, 感谢http://www.jianshu.com/p/5ab77b7d6b4c, 图也是借用他家的

    创建pch.png

    @discardableResult 的使用

    在 Swift 3 编译器下,如果一个 func 返回了一个对象,而你没有使用它时,会有一个 WARNING。

    这里有两种方法可以解决这个 WARNING。

    第一种:在 func 定义的前面,加上 @discardableResult 的修饰符,代表可以不使用返回值,这样编译器就不会有警告了。在我们自己定义的 func 上基本上都可以这么做。

    但是还会有一种情况,用了第三方库或者系统库返回的对象怎么办?那只能用第二种办法:

    _ = navigationController?.popViewController(animated: true)

    感谢http://www.tuicool.com/articles/eaqiUfY

    关于在调试模式打印, 生产环境不打印

     func PrintLog<N>(message:N,fileName:String = #file,methodName:String = #function,lineNumber:Int = #line){
                 #if DebugType
              print("\(fileName as NSString)\n方法:\(methodName)\n行号:\(lineNumber)\n打印信息\(message)");
                #endif
       }
    

    感谢http://blog.csdn.net/june_email/article/details/52369377

    适配不同系统版本

    //系统版本适配
        if #available(iOS 9.0, *) {
        } else {
            // Fallback on earlier versions
        }
    

    dealloc没有啦, 现在是deinit {}

    关于注释

    感谢http://www.jianshu.com/p/307427e6d990
    普通注释当然还是command + /
    其他的效果也能出来, 但是打的时候没有代码提示稍显遗憾
    oc时代的pragma如今是

    //MARK:- xxx
    

    有横线是有分割线, 若要加横线, xxx要在横线后空一格

    一些功能可能需要以后添加或者补全

    //TODO: XXXX
    

    会有一些小的bug,不紧急也不影响程序的运行,可以暂时不予处理,稍后需要修改

    //FIXME: XXXX
    

    怎么打出oc时代那种warning呢, 需要以下几步
    感谢http://www.th7.cn/Program/IOS/201603/773307.shtml
    http://stackoverflow.com/questions/24183812/swift-warning-equivalent 的第一个回答

    warning第一步.png
    warning第二步.png
    warning第三步.png

    但是我们只希望他在调试环境下警告
    第三幅图原本是

    TAGS="TODO:|FIXME:"
    echo "searching ${SRCROOT} for ${TAGS}"
    find "${SRCROOT}" /( -name ".swift" /) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS)./$" | perl -p -e "s/($TAGS)/ warning: /$1/"

    改为

    if [ "${CONFIGURATION}" = "Debug" ]; then
    TAGS="TODO:|FIXME:"
    echo "searching ${SRCROOT} for ${TAGS}"
    find "${SRCROOT}" ( -name ".swift" ) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).$" | perl -p -e "s/($TAGS)/ warning: $1/"
    fi

    用的时候这么用, TODO也可以

    //#warning
    //#FIXME: xxxxxx
    

    关于图片渲染方式的语法

    这是swift3版的

    UIImage.init(named: normalImage)?.withRenderingMode(.alwaysOriginal)
    

    数组字典增删改查

    还没做到这, 先记录一下
    http://blog.csdn.net/jiang314/article/details/51488302

    关于for

    这个是重点, swift已经彻底去C化, 据说语法表达与phython很接近, 他的forin和OC差不多, for后面写个变量接收, in后面是被遍历的集合
    感谢http://www.cnblogs.com/lingluo/p/6028737.html
    1:如何遍历一个字典或者数组?

    数组

    let list = [1, 3, 5, 7, "string test"] as [Any]
    for i in list{
          print(i)
    }
    

    字典

    let dict = ["name":"key name", "name1":"key1 name", "name2":"key2 name"]
    for key in dict.keys {
        print("key==\(key)")
    }
        
    for value in dict.values{
         print("value==\(value)")
    }
    

    2.如果只是简单的计数器

    for i in 1..<10{
        print(i)
        // 打印结果为1-9
    }
    for i in 1...10{
        print(i)
        //打印结果为1-10
    }
    

    3.如果需要递减循环遍历

    for i in (0...10).reversed(){
           print(i)    // 打印结果为10-0
     }
    
    1. 遍历元素并获取下标

       for (index, i) in (1...10).enumerated(){
              print(index)// 遍历索引
               print(i) // 遍历元素
        }
      
    2. 遍历的同时过滤

      for i in (1...10).filter({ i in i % 2 == 0}) {
               print(i)
               //输出结果为1-10之间的偶数
      }
      ///////////补充一个漂亮的语法糖///////////
       for i in (1...10).filter({ $0 % 2 == 0}) {//swift闭包可以省略参数且用$0匿名,第二个参数则用$1,以此类推
          print(i)
          //输出结果为1-10之间的偶数
       }
      

    关于实例方法和类方法

    这是实例方法
    func compareServerVersion(serverVersion:String, localVersion:String) -> Bool{}

    这是类方法
    class func compareServerVersion(serverVersion:String, localVersion:String) -> Bool{}

    对, 就是方法前面有没有class修饰罢了

    关于使用SwiftyJSON层层解析获取到的值

    用let直接接收后, 如果要使用的话, 如果知道这个值是字符串, 直接该值.string 即可使用

    使用private 隐藏属性

    如果想要隐藏getter, setter

    private let page: UIPageControl? = nil
    

    如果只是隐藏setter

    private(set) var diameter: Double = 0
    

    关于重写setter 和 懒加载

    重写setter, 如果这么写就不需声明属性了

    //    var 属性名: 属性类名? {
    //        //替代OC中重写setter方法,didSet没有代码提示
    //        //区别:不用考虑 _成员变量 = 值!
    //        //OC中如果是copy属性,应该 _成员变量 = 值 copy
    
    //这个willSet是在赋值之前
    //    willSet(newTotalSteps) { 
    //    println("About to set totalSteps to \(newTotalSteps)") 
    //    } 
    
    //        didSet {
    //            //此时属性已经有值,可以设置内容
    //            
    //        }
    //    }
    

    懒加载, 也可以private lazy var来限定作用域
    小心循环引用, 所以小心使用self.

    //1. 懒加载简单写法
    lazy var label: UILabel = UILabel();
    
    //2.分析 NSArray 是一个闭包的返回值,而这是一个没有参数的闭包
    lazy var dataArray: NSArray = { [] }()
    
    //3.也可以写成这样
    lazy var dataArray2:NSArray = {
        return NSArray()
    }()
    
    //4.完整写法
    lazy var loginButton : UIButton = {
        let btn = UIButton(type: .custom)
        btn.frame = CGRect(x: 50, y: 20, width: 10, height: 40)
        btn.backgroundColor = UIColor.white
        btn.setTitleColor(UIColor.lightGray, for: .normal)
        btn.setTitle("登 录", for: .normal)
        
        return btn
    }()
    

    桥接文件

    1. 创建一个oc的类, 会提示是否创建桥接文件, 确认;

    2. 点击这个桥接文件, 把左侧文件名拉进来, 整个剪切

    3. build settings 搜索bridging, 然后粘进去, 然后在桥接文件里面 #import "SVProgressHUD.h", 如果失败, 把桥接文件删了多来几遍, 就是这么神奇

    关于截取String类型的字符串

    太酷炫的还没研究, 暂时会这种
    感谢 http://blog.csdn.net/longshihua/article/details/53883949

    s.startIndex 从第一个字符开始
    s.endIndex 从最后一个字符开始

     let s="1234567890"
        
        let index = s.index(s.startIndex, offsetBy: 5)
        let index2 = s.index(s.endIndex, offsetBy: -6);
    
        let length = s.characters.count
        let index3 = s.index(s.endIndex, offsetBy: -(length - 1))
    
        let s1:String = s.substring(from:index)//from:取index划好的范围的数
        let s2:String=s.substring(to:index2)//to:舍弃index划好的范围的数
        let s3 = s.substring(from: index3)
    
        print(s1)//67890
        print(s2)//1234
        print(s3)//234567890
    

    写一点语法糖

    有些不知道算不算语法糖

    不在闭包中的, 无论调用方法还是属性, 而且这些方法属性无论是自己声明还是系统自带, 皆可省去self., 但不可以再像oc一样用下划线+属性名

    如果等号左边已知变量的数据类型, 则等号右边的属性或方法调用可省去类名, 直接.xxx即可

    以下这句代码可示例上面两种情况

    contentView.backgroundColor = .white
    

    相关文章

      网友评论

          本文标题:关于swift3.0

          本文链接:https://www.haomeiwen.com/subject/wqmdittx.html