cocoaPods 引入三方后控制台有警告
感谢http://www.99css.com/1346/, 虽然人家遇到问题跟我不太一样, 但是解决步骤是一样的
当使用cocoaPods update之后, 在podFile里面, 先把
platform :ios, '8.0'
的注释解开,
然后会看到控制台说
The
OneOneFourSwiftTests [Release]
target overrides theALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES
build setting defined inPods/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, 一样可以, 感谢//www.greatytc.com/p/5ab77b7d6b4c, 图也是借用他家的
@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 {}
关于注释
感谢//www.greatytc.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 的第一个回答
但是我们只希望他在调试环境下警告
第三幅图原本是
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
}
-
遍历元素并获取下标
for (index, i) in (1...10).enumerated(){ print(index)// 遍历索引 print(i) // 遍历元素 }
-
遍历的同时过滤
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
}()
桥接文件
创建一个oc的类, 会提示是否创建桥接文件, 确认;
点击这个桥接文件, 把左侧文件名拉进来, 整个剪切
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