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 这个风格指南可能和你从其它地方看到的不同,我们的焦点主要集中在互联网和文章上的可读性.创建 ...
随机推荐
- 第一章 初识Mysql
Mysql是一个开放源代码的数据库管理系统(DBMS),它是由MySQL AB 公司开发.发布并支持的. 登录 -- mysql #本地登录,默认用户root,空密码,用户为root@127.0.0. ...
- windows环境安装phantomjs和pyspider遇到的问题
1. 安装phantomjs 下载地址:http://phantomjs.org/download.html 解压后将phantomjs.exe文件放到python根目录 2.安装pyspider p ...
- caffe服务器搭建血泪记录
装过很多次caffe了,但这个还是遇到了很多奇葩问题,不过以前都是在ubuntu上,这次是在centos上. 1.import error _caffe.so: undefined symbol: ...
- js 实现控制点击事件在特定的毫秒内 只允许点击一次(防止重复点击)
代码 第一种方法 var forbidRepeartClick = (function(){ var instance = null; var canClick = true; function Bu ...
- ****微信小程序架构解析
| 导语 微信小程序的公测掀起了学习小程序开发的浪潮,天生跨平台,即用即走.媲美原生体验.完善的文档.高效的开发框架,小程序给开发者带来了很多惊喜.通过这篇文章和大家一起分析小程序的架构,分享开发 ...
- 两个spring boot项目war部署到tomcat 其中一个无法正常启动
Spring Boot的spring.jmx资源管理是默认打开的,而两个项目同时使用会冲突 需要在第二个.或者第三个springboot项目中增加如下配置: 1:application.propert ...
- Oracle 去特殊字符
Create Or Replace Function Zl_Fun_去特殊字符(内容_In In Varchar2) Return Varchar2 IsBegin Return Replace(Re ...
- 这篇通俗实用的Vlookup函数教程,5分钟就可以包你一学就会
如何利用Vlookup函数获取学号中的班级信息.换言之,咱们源数据中放着姓名性别学号班级等信息,而在另一张表格中一定有学号信息,但其他信息就未必有,这需要我们将缺失的信息自动同步过去.使用vlooku ...
- arcgis js 鼠标点和绘制的点位有偏移
问题描述:鼠标点和绘制的点位有偏移 问题原因:地图DIV中包含了一个面板DIV,停靠在了地图页面的左边,隐藏掉就是正确了 解决方法:重写DIV样式,让左边DIV与地图DIV平级排列.
- 记录一些基本的git命令
本地操作 向git仓库添加文件 git status 查看工作区文件状态 git add a.php 将文件添加到暂存区 git commit -m "描述" 将文 ...