Swift 编程杂谈
1、Swift 3.0 使用Cocopods 导入第三方报错
之前一直用Object-C 编写代码 用Cocopods导入第三方没出过什么问题(PS:2017最新cocoaPods安装教程)
今天用Swift写项目 导入第三方的时候出现这个错误:
[!] Pods written in Swift can only be integrated as frameworks; add `use_frameworks!` to your Podfile or target to opt into using it. The swift Pods being used are: ExSwift
后来查证,需要在Podfile文件中加入use_frameworks!
之前是这样写的:
platform :ios, ’10.3’
target ‘MySwiftDemo’ do
pod 'ExSwift', '~> 0.1.9'
end
加上 use_frameworks! 问题解决
platform :ios, ’10.3’
target ‘MySwiftDemo’ do
pod 'ExSwift', '~> 0.1.9'
use_frameworks!
end
2、重写UINavigationController 返回按钮 backBarButtonItem&leftBarButtonItem
项目中很多地方要重写返回按钮样式或者要在返回事件中进行一些操作,这就要重写backBarButtonItem或者leftBarButtonItem两个属性。
①、对当前页面而言,leftBarButtonItem的优先级最高,如果对当前页面的self.navigationItem.leftBarButtonItem赋新值,则当前页面每次被push进来左上角显示的就是这个新的UIBarButtonItem。
②、如果当前页面的self.navigationItem.leftBarButtonItem没有赋新值,但是push当前页面进来的上个页面的self.navigationItem.backBarButtonItem 重新赋值了,则当前页面的左上角显示上个页面的self.navigationItem.backBarButtonItem。
③、如果当前页面的leftBarButtonItem和上个页面的backBarButtonItem都没有赋新值,则当前页面的左上角显示默认的返回按钮,一个向左的箭头和上个页面导航栏的title。
注意:针对第②种情况,给 self.navigationItem.backBarButtonItem 赋新值的时候,创建 UIBarButtonItem 时,使用:
public convenience init(barButtonSystemItem systemItem: UIBarButtonSystemItem, target: Any?, action: Selector?) public convenience init(customView: UIView)
这两种方法都是无效的(亲测无效,知道原因的小伙伴可以告知我),下个页面的左上角的返回按钮仍会按照第三种情况的样式显示。
使用:
public convenience init(image: UIImage?, style: UIBarButtonItemStyle, target: Any?, action: Selector?)
创建时,会同时显示两个图片,左边的是系统默认向左的箭头(默认蓝色),右边的是你添加的图片
使用:
public convenience init(title: String?, style: UIBarButtonItemStyle, target: Any?, action: Selector?)
创建时,依然会显示系统默认的向左的箭头,右边的文字显示的是创建时的title。(如果title为nil 则只显示系统默认的箭头)
补充:leftBarButtonItem的优先级高于backBarButtonItem,如果当前页面的leftBarButtonItem被赋新值,push当前页面的backBarButtonItem也赋新值,则当前页面左上角返回按钮显示leftBarButtonItem!!
3、在stryboard修改navigationBar的属性(如:barTintColor、titleColor等)会出现警告!!
警告内容如下:
Frame for "Navigation Bar" will be different at run time.
Width will be 320 at run time but is 375 in the canvas.
意思是视图在运行时宽度会改变(Width由375变为320),我试图点击自动布局进行修改,却发现修改不了,后来在stackoverflow找到答案,需要修改Navigation Controller的Simulated Size为Freeform即可。
4、使用cocopods时,pod install和pod update什么时候用
许多人开始使用CocodPods的时候认为pod install只是你第一次用CocoaPods建立工程的时候使用,而之后都是使用pod update,但实际上并不是那会事。
简单来说,就是:
①、使用pod install来安装新的库,即使你的工程里面已经有了Podfile,并且已经执行过pod install命令了;所以即使你是添加或移除库,都应该使用pod install。
②、使用pod update [PODNAME] 只有在你需要更新库到更新的版本时候用。
5、Swift中创建Swift File文件编写全局变量无效
OC中常用的变量我们都是写在pch文件中,可是Swift中搭建ProjectName-Bridging-Header.h(OC和Swift混编)文件引入pch文件并没有效果,所以我们需要另辟蹊径。
解决方法:
Command+N创建Swift File文件,将常用的全局变量写在这个Swift文件中,Swift中不需要对.h文件的引入,如果项目需要混编,头文件的引入写在Bridging-Header.h中。这时候问题来了,我穿件好Swift File文件,写入全局变量却不能在其他文件中调用,很是恼火!
最后得到解决,需要将创建的Swift File文件与调用全局变量的文件放在同一个根文件下!
6、关键字static和class的区别
在方法的func关键字之前加上关键字static或者class都可以用于指定类方法. 不同的是用class关键字指定的类方法可以被子类重写, 如下:
override class func work() {
print("Teacher: University Teacher")
}
但是用static关键字指定的类方法是不能被子类重写的
根据报错信息: Class method overrides a 'final' class method. 我们可以知道被static指定的类方法包含final关键字的特性--防止被重写.
类方法和实例方法可以重名,但不建议写相同的方法名.
7、Swift_修饰符(final、override、discardableResult、mutating、lazy、inout.....)
①、final 防止重写
//防止重写
class finalClass{
final var applePen = 1
final func test(){ } final class func test2(){ }
} class finalSub: finalClass {
//无法重写基类 定义了 final 的属性和函数
} //加到class前,无法被继承
final class unDo{ }
②、@discardableResult
@discardableResult //取消如果不使用返回值的警告
class func unUseReuslt(d x:Int) -> Bool { return true
}
③、mutating
实例化的时候,实参是不可改变,如果确实需要改的话加 mutating
struct Point {
var x = 0, y = 0 mutating func moveXBy(x:Int,yBy y:Int) {
self.x += x
self.y += y
}
} var p = Point(x: 5, y: 5) p.moveXBy(3, yBy: 3)
另外,在值类型的实例方法中,也可以直接修改self属性值。
enum TriStateSwitch {
case Off, Low, High
mutating func next() {
switch self {
case Off:
self = Low
case Low:
self = High
case High:
self = Off
}
}
}
var ovenLight = TriStateSwitch.Low
ovenLight.next()
// ovenLight is now equal to .High
ovenLight.next()
// ovenLight is now equal to .Off”
④、convenience便利构造器
// 指定构造器 和 便利构造器
class Food {
var name: String
init(name: String) {
self.name = name
}
//便利构造器
convenience init() {
self.init(name: "[Unnamed]")
} }
⑤、lazy懒加载
Object-C的懒加载是当使用时才去开辟空间,set get方法
Swift 懒加载相当于静态空间,只运行一次....只打印一次 a = 1
lazy var num: Int = {
print("只打印一次!")
return 1
}() print(num)
num += num
print(num) // 只打印一次!
// 1
// 2
Swift 编程杂谈的更多相关文章
- 窥探Swift编程之别样的HelloWorld
从今天就开始陆陆续续的发布一些有关Swift语言的东西,虽然目前在公司项目开发中Objective-C还是iOS开发的主力军,但是在不久的将来Swift将会成为iOS开发中的新生宠儿.所以在在Xcod ...
- Swift 编程风格指南(raywenderlich.com 版本号)
官方 raywenderlich.com Swift 编程风格指南 本文版权归 raywenderlich.com .The Official raywenderlich.com Swift Styl ...
- Swift 编程思想 阅读笔记
Swift 编程思想,第一部分:拯救小马html, body {overflow-x: initial !important;}.CodeMirror { height: auto; } .CodeM ...
- Swift编程权威指南第2版 读后收获
自从参加工作一直在用OC做iOS开发.在2015年的时候苹果刚推出swift1.0不久,当时毕竟是新推出的语言,大家也都很有激情的学习.不过在学完后发现很难在实际项目中使用,再加上当时公司项目都是基于 ...
- Swift 编程思想 Part 4:map all the things!
Swift 编程思想 Part 4:map all the things! 2015-10-22 837 文章目录 1. 数组 vs. 可选类型 2. 作用在可选类型上的 map() 3. 回到我们 ...
- 编程杂谈——std::vector与List<T>的性能比较
昨天在比较完C++中std::vector的两个方法的性能差异并留下记录后--编程杂谈--使用emplace_back取代push_back,今日尝试在C#中测试对应功能的性能. C#中对应std:: ...
- 窥探Swift编程之强大的Switch
之前初识Swift中的Switch语句时,真的是让人眼前一亮,Swift中Switch语句有好多特有而且特好用的功能.说到Switch, 只要是写过程序的小伙伴对Switch并不陌生.其在程序中的出镜 ...
- 【Swift学习】Swift编程之旅---类和结构体(十三)
与其他编程语言所不同的是,Swift 并不要求你为自定义类和结构去创建独立的接口和实现文件.你所要做的是在一个单一文件中定义一个类或者结构体,系统将会自动生成面向其它代码的外部接口. 注意:通常一个类 ...
- raywenderlich.com的Swift编程风格指南
翻译自:https://github.com/raywenderlich/swift-style-guide 这个风格指南可能和你从其它地方看到的不同,我们的焦点主要集中在互联网和文章上的可读性.创建 ...
随机推荐
- 解决 DBMS_AW_EXP: BIN$*****==$0 not AW$
在Oracle 11.2.0.4 版本的数据库中,使用数据泵导出数据时,有可能会遇到这样的提示: 示例1 Connected to: Oracle Database 11g Enterprise Ed ...
- mysql5.7初始化密码报错 ERROR 1820 (HY000): You must reset your password using ALTER USER statement before
mysql初始化密码常见报错问题1,mysql5.6是密码为空直接进入数据库的,但是mysql5.7就需要初始密码 cat /var/log/mysqld.log | grep password1 2 ...
- 学习HTML5, Canvas及简单动画的使用
通过在CSDN中的一些简单课程学习,跟随老师联系,做了如下的月亮,太阳和地球的运动效果.纪录在文章中,用于下次使用. 准备工作如下: 1. 使用三张背景图片 太阳 月亮 地球 2. 在HTML页面中定 ...
- 自己动手造拖拉机轮子系列 -(react-loadable)
最新消息:react官方已支持懒加载https://reactjs.org/docs/code-splitting.html#reactlazy 文章webpack分片chunk加载原理中深入探究了异 ...
- thinkPHP5扩展workerman
-安装workerman 首先通过 composer 安装 composer require topthink/think-worker -vvv 如果报错: Installation failed, ...
- Angular 项目列表页
$ ng g m project 功能:项目列表显示,增加,修改,删除项目.邀请其它人员加入项目. 单一性原则:希望搭建多个组件,每个组件负责自己的功能. 一.project相关组件 $ ng g c ...
- js 屏蔽政治关键字
一般情况下,用户输入评论提交到后台的同时,在后台进行关键字过滤,昨天看到了一个js关键字过滤的方法,记录下. 方法很简单,先把需要过滤的关键字做成数组, 在for循环数组判断有没有匹配. ok,先来个 ...
- python3 代理设置
前言: 用过很多种代理使用方式,这里总结一下. 1.urllib+socks5的代理1 from sockshandler import SocksiPyHandler import socks fr ...
- Linux中设置服务自启动的三种方式,ln -s 建立启动软连接
有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务(http://www.0830120.com) 主要用三种方式进行这一操作: ln -s 在/etc/rc.d/rc*.d目录中建立 ...
- python3中列表、元组、字典的增删改查说明详解
python基础中的列表.元组.字典属于python中内置的序列数据结构.其中序列可以进行的操作包括索引.截取(切片).加.乘.成员检查等. 1.列表 列表(list)是最常用的python数据类型之 ...