关于swift3.0

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
关于桥文件的配置,小伙伴们可以百度一下,不过有个技巧,自己建立个.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, 图也是借用他家的

关于swift3.0_第1张图片
创建pch.png

@discardableResult 的使用

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

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

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

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

_ = navigationController?.popViewController(animated: true)

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

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

 func PrintLog(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 的第一个回答

关于swift3.0_第2张图片
warning第一步.png

关于swift3.0_第3张图片
warning第二步.png

关于swift3.0_第4张图片
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)