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 这个风格指南可能和你从其它地方看到的不同,我们的焦点主要集中在互联网和文章上的可读性.创建 ...
随机推荐
- 【easy】532. K-diff Pairs in an Array
这道题给了我们一个含有重复数字的无序数组,还有一个整数k,让我们找出有多少对不重复的数对(i, j)使得i和j的差刚好为k.由于k有可能为0,而只有含有至少两个相同的数字才能形成数对,那么就是说我们需 ...
- 初学ASP.NET 知识点
1.C# 中的虚方法 和 C++中的作用一致,能让指向子类的父类指针优先到子类中寻找方法,而不是直接调用父类中的方法. 看一段例子回忆下: namespace ConsoleApplication1 ...
- pyspider
Linux系统我使用CentOS.对于pycurl安装问题比较好解决,只需要先安装对应的开发包即可.执行如下命令: yum install python-devel curl-devel 分别安装py ...
- Django-视图层(view)
视图层(view) 视图函数,简称视图,本质上是一个简单的Python函数,它接受Web请求并且返回Web响应.响应的内容可以是HTML网页,重定向,404错误,图片等任何东西,但本质是返回响应对 ...
- vue打包遇到的坑
1.-webkie-box-orient:vertical没大打包上,解决方案 /* ! autoprefixer: off */ -webkit-box-orient: vertical; /* a ...
- axios 拦截器统一在接口增加时间戳参数,防止走缓存。
request.interceptors.request.use( config => { if (config.method == 'post') { config.data = { ...c ...
- JSON字符串自动转换
package com.zkn.newlearn.json; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObj ...
- [原创]基于Zynq PS与PL之间寄存器映射 Standalone & Linux 例程
基于Zynq PS与PL之间寄存器映射 Standalone & Linux 例程 待添加完善中
- Exp1 PC平台逆向破解 20165235 祁瑛
Exp1 PC平台逆向破解 20165235 祁瑛 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字 ...
- linux学习之命令的排列、替换和别名--2019-04-23
1.命令的排列 1)使用“;” 使用“;”命令时,不管命令1是否出错,接下来都执行命令2. 2)使用“&&” 使用“&&”命令时,只有命令1正确运行,接下来才会执行命令 ...