Swfit语法tips

关于函数和闭包的介绍

image.png
image.png

在Swift中定义的Enum,OC中使用

Swift中定义如下,注意@objc

import Foundation
import IQKeyboardManagerSwift

@objc enum RotateState: Int {
    case RotateStateDisable
    case RotateStateEnable
    case RotateStateCameraLive
}

class SystemInitManager: NSObject {
    
    @objc var allowRotation: RotateState = .RotateStateDisable

    //MARK: 单例
    @objc static let shared = SystemInitManager()
    private override init() {
        super.init()
    }
    
    func config() {
        ZYNetworkManager.sharedInstance()
        IQKeyboardManager.sharedManager().enable = true
    }
}

在OC中使用方法如下:

    SystemInitManager.shared.allowRotation = RotateStateRotateStateEnable;

不能用OC的写的类去继承Swift的类


stackoverflow

init 与 viewDidLoad调用顺序

参考链接
init 与 viewDidLoad调用顺序在UITabBarController及其之类中,viewDidLoad调用在先;在其他Controller中,init调用在先;

判断是否是iPhone X方法

     class func isIphoneX() -> Bool {
        let app = UIApplication.shared
        let statusBar = app.value(forKey: "statusBar") as AnyObject
        guard let _ = NSClassFromString("UIStatusBar_Modern") else {
            return false
        }
        if statusBar.isKind(of: NSClassFromString("UIStatusBar_Modern")!) {
            return true
        } else {
            return false
        }
    }

Attention

服务器获取的JSON在Swift中会被表示成一个[String: Any]的字典

Dictionary 为 [:] 和 nil的时候

        let dic1: [String: String] = [:]
        let dic2: [String: String]? = nil
        
        ZYPrint(markStr: "dic1.count", message: dic1.count)
        ZYPrint(markStr: "dic2.count", message: dic2?.count)
        
        if dic1.isEmpty {
            print("dic1.isEmpty")
        }
        
        if (dic2?.isEmpty)! {
            print("dic2.isEmpty")
        }

输出如下

****************************************
dic1.count:
0

****************************************
dic2.count:
nil
dic1.isEmpty

最后还会crash


UserDefaults

Objective-C中需要调用 synchronize 方法进行同步, 但是在Swift中已经废弃了该方法, 所以不需要手动去调用.
-synchronize is deprecated and will be marked with the NS_DEPRECATED macro in a future release.

给系统类添加属性

参考Alamofire

extension URLSession {
    private struct AssociatedKeys {
        static var managerKey = "URLSession.ServerTrustPolicyManager"
    }

    var serverTrustPolicyManager: ServerTrustPolicyManager? {
        get {
            return objc_getAssociatedObject(self, &AssociatedKeys.managerKey) as? ServerTrustPolicyManager
        }
        set (manager) {
            objc_setAssociatedObject(self, &AssociatedKeys.managerKey, manager, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
}

判断是否是iPhone X

注意这里判断是否属于某个类型的方法

func isIphoneX() -> Bool {
    
    let app = UIApplication.shared
    let statusBar = app.value(forKey: "statusBar") as! UIView
    guard let statusClass = NSClassFromString("UIStatusBar_Modern") else {
        return false
    }
    if statusBar.isKind(of: statusClass) {
        return true
    } else {
        return false
    }
}

as & as! & as?

http://blog.csdn.net/h454036111/article/details/49151933
一,as
摘自中文api的话:仅当一个值的类型在运行时(runtime)和as模式右边的指定类型一致 - 或者是该类型的子类 - 的情况下,才会匹配这个值。如果匹配成功,被匹配的值的类型被转换成as
模式左边指定的模式。
首先是运行时 就不多说了 ,重要的是 as 应用条件有2种情况:
1,和 "as" 右边类型一致
2,是右边类型的子类(这种情况在java里叫向上转型)
事例代码如下:


二,as!
上例中 第二种情况 2,是右边类型的子类 如果 碰到as 左边类型是右边类型的父类则会报错!(as不可以用于父类转子类,用java话说,不支持向下转型),由此可用as!(强转)

编译器也会提示你用as!, as!强转如果类型不符合会报错。
三,as?
as? 相当于optional类型,如果转换失败返回nil。
上代码!

定义属性有些可以不用加?

看看这里返回的方式


class PageContentView: UIView {
    
    // MARK:- 定义属性
    fileprivate var childVcs : [UIViewController]
    fileprivate weak var parentViewController : UIViewController?
    fileprivate var startOffsetX : CGFloat = 0
    fileprivate var isForbidScrollDelegate : Bool = false
// weak只能修饰可选类型
    weak var delegate : PageContentViewDelegate?
    
    // MARK:- 懒加载属性,
    fileprivate lazy var collectionView : UICollectionView = {[weak self] in //闭包里面self 加weak
        // 1.创建layout
        let layout = UICollectionViewFlowLayout()
        layout.itemSize = (self?.bounds.size)! // 可选链返回的一定是可选类型,所以这里要解包,一定有值,所以强制解包!
        layout.minimumLineSpacing = 0
        layout.minimumInteritemSpacing = 0
        layout.scrollDirection = .horizontal
        
        // 2.创建UICollectionView
        let collectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: layout)
        collectionView.showsHorizontalScrollIndicator = false
        collectionView.isPagingEnabled = true
        collectionView.bounces = false
        collectionView.dataSource = self
        collectionView.delegate = self
        collectionView.scrollsToTop = false
        collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: ContentCellID)
        
        return collectionView
    }()
    
    // MARK:- 自定义构造函数
    init(frame: CGRect, childVcs : [UIViewController], parentViewController : UIViewController?) {
        self.childVcs = childVcs
        self.parentViewController = parentViewController
        
        super.init(frame: frame)
        
        // 设置UI
        setupUI()
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}

关于for循环

for _ in 0..<4 {
}

for view in cell.contentView.subviews {
}

for (index, value ) in array {
}
这三个替代以前的
for (int i = 0,  i < array.count, i++)  {
}

cell 注册相关

以后还是注册一下比较好,养成习惯

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        /*代码创建,并且没有注册cell的情况下,用dequeueReusableCell(withIdentifier identifier: String) -> UITableViewCell?
         如果已经注册了,或者用的xib,就使用dequeueReusableCell(withIdentifier identifier: String, for indexPath: IndexPath) -> UITableViewCell
         */
        //??空合运算符,a ?? b,对可选类型a进行判断,为nil默认值为b,不为空就解封
        let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier) ?? UITableViewCell(style: .subtitle, reuseIdentifier: reuseIdentifier)
        let text = datas[indexPath.row]
        
        cell.textLabel?.text = text
        cell.textLabel?.textColor = .white
        cell.textLabel?.font = UIFont(name: fontNames[fontNumber], size: 24)
        cell.backgroundColor = .black
        
        return cell
    }

宏定义

swift中是不能使用宏定义语法的,但是因为命名空间的缘故,我们可以给我们的项目添加一个空的Const.swift文件,在其中,我们将原本oc中不需要接受参数的宏,定义成let常量,将需要接受参数的宏定义成函数即可,由于我们的整个项目共享命名空间,我们就可以在项目内的任何地方直接使用Const.swift中定义的这些公共的常量和函数
http://www.jianshu.com/p/5f5f7c4e1dc0

static & class

1,结构体struct和枚举enum的静态属性,静态方法使用static关键字
2,类class的类型属性,类型方法使用class关键字
http://www.hangge.com/blog/cache/detail_520.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容