标签:
最近在学swift,本以为多是语法与oc不同,而且都是使用相同的cocoa框架,相同的API,但是或多或少还是有些坑在里,为了避免以后再踩,在这里记下了,以后发现新的坑,也会慢慢在这里加上
[TOC]
UIApplicationMain(Process.argc, Process.unsafeArgv, nil, NSStringFromClass(AppDelegate))
命名空间 .
+类名
//获取命名空间,在info.plist文件里就是Executable file
let nameSpace = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"] as! String
//拼接成固定格式
let controller:AnyClass = NSClassFromString(nameSpace + "." + controllerName)!
//创建对象
let viewController = (controller as! UIViewController.Type).init()
Any:所有基本数据类型和enum/ struct都可以用Any来表示
注意: 有的时候你会发现将基本数据类型或者enum/ struct通过AnyObject来保存也不会报错, 这是因为Swift中很多数据类型可以和OC中的数据类型进行自动转换, 系统内部已经将他们转换为了OC的对象类型
AnyClass: 用来表示任意类的类类型(元类型)
typealias AnyClass = AnyObject.Type
.Type用于获取类的元类型, 例如Person.Type就代表着获取Person的元类型
.self如果通过类名调用, 那么可以获取该类的类型, 说白了就是获取自己
do{
let path = /..路径../
let data =/..转data../
//编译器会要求你实行异常检测,于是在序列化前面添加try字段
//外部包裹do,catch,显而易见出错自然会走catch
let dicArr = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers)
}catch
{
// 如果抛出异常就会来到catch
}
func HJSLog<T>(message: T)
{
#if DEBUG
print("\(message)")
#endif
}
static var onceToken: dispatch_once_t = 0
static var instance: NetworkTools?
class func shareNetworkTools() -> NetworkTools
{
dispatch_once(&onceToken) { () -> Void in
print("我被调用了")
instance = NetworkTools()
}
return instance!
}
static let instance: NetworkTools = NetworkTools()
class func shareNetworkTools() -> NetworkTools
{
return instance
}
private
private
是不够的@objc
//按钮点击handle
@objc private func composeClick(){
}`
///懒加载一个imageView
private lazy var icon:UIImageView = {
let imageV = UIImageView(image: UIImage(named: "visitordiscover_feed_image_smallicon"))
return imageV
}()
@objc
protocol VisitorViewDelegate:NSObjectProtocol
{
//点击注册按钮
optional func visitorViewDidRegisterBtnClick(visitView: VisitorView)
//点击登录按钮
optional func visitorViewDidLoginBtnClick(visitView:VisitorView)
}
weak var delegate:VisitorViewDelegate?
///注册handle
@objc private func registerClick(){
delegate?.visitorViewDidRegisterBtnClick!(self)
}
///登录handle
@objc private func loginClick(){ delegate?.visitorViewDidLoginBtnClick?(self)
}
extension
就是swift中的分类import UIKit
extension UIBarButtonItem
{
convenience init(target:AnyObject?,action:Selector,image:String) {
let btn = UIButton(type: UIButtonType.Custom)
btn.setImage(UIImage(named: image), forState: UIControlState.Normal)
btn.setImage(UIImage(named: image + "_highlighted"), forState: UIControlState.Highlighted)
btn.addTarget(target, action: action, forControlEvents: UIControlEvents.TouchUpInside)
self.init(customView:btn)
}
}
class MyClass {
func methodMustBeImplementedInSubclass() {
fatalError("这个方法必须在子类中被重写")
}
}
class YourClass: MyClass {
override func methodMustBeImplementedInSubclass() {
print("YourClass 实现了该方法")
}
}
class TheirClass: MyClass {
func someOtherMethod() {
}
}
YourClass().methodMustBeImplementedInSubclass()
// YourClass 实现了该方法
TheirClass().methodMustBeImplementedInSubclass()
// 这个方法必须在子类中被重写
required init(coder: NSCoder) {
fatalError("NSCoding not supported")
}
fatalError
来抛出错误guard
与fatalError
的配合使用达到断言的效果
guard let safeValue = criticalValue else {
fatalError("criticalValue cannot be nil here")
}
someNecessaryOperation(safeValue)
if
也可以达到这样的效果
if let safeValue = criticalValue {
someNecessaryOperation(safeValue)
} else {
fatalError("criticalValue cannot be nil here")
}
if criticalValue == nil {
fatalError("criticalValue cannot be nil here")
}
someNecessaryOperation(criticalValue!)
但是看到有些博客这么说:
这个flatten code以其他方式进入一个if let 代码块,并且在靠近相关的环境中过早地退出了,而不是进入else代码块。甚 至当你没有捕获一个值(guard let),这个模式在编译期间也会强制过早退出。在第二个if的例子里,尽管代码flattend得像guard一样,但是一个毁灭性的错误或者其他返回 一些无法退出的进程(或者基于确切实例的非法态)将会导致crash。一个过早的退出发生时,guard声明将会及时发现错误,并将其从else block中移除。(这博主翻译得真烂)
所以,还是用guard比较好
@synchronized(self) {
//需要执行的代码块
}
objc_sync_enter(self)
//需要执行的代码块
objc_sync_exit(self)
__weak typeof(self) weakSelf = self;
//这里用gcd举例不好,毕竟系统的块不会造成循环引用,这里就勉强的学一下怎么改吧
dispatch_async(dispatch_get_global_queue(0, 0)) {[unowned self] () -> Void in
self.view
//添加自己的代码
}
[unowned self]
即可标签:
原文地址:http://www.cnblogs.com/Free-Thinker/p/5400305.html