FlyCoding - Xcode版 Emmet

⚠️ 请使用 Swift 4.2 编译 ⚠️

FlyCoding 是一个 Xcode 插件,使用苹果提供的插件机制编写,可以运行在最新的Xcode上, 它提供了类似于前端中 Emmet 的功能。你可以通过特殊语法来快速的生成你想要的 Swfit / Objective-C 代码,特别是在大量的编写界面 UI 时, 重复的编写 UI 控件和约束是一件非常繁琐和机械的劳动, 但是这又是你不可避免的。
而 FlyCoding 则可以帮助你快速的生成属性、方法、约束(Masonry / SnapKit),目前 FlyCoding 刚刚发布了第一个版本,更多的功能还在构思当中,希望大家提供宝贵的意见和想法。

目前开发进度:
  • [x] Objective-C / Swift 属性生成
  • [x] Objective-C / Swift 视图的快速创建
  • [x] Masonry / SnapKit 约束生成
  • [x] 快速生成方法
  • [x] 任何完整操作都可以使用 ’ + ’ 进行分隔, 使用 ’ *N’ 进行批量操作

属性生成

Swift属性生成

  • 单个属性
pv.UIImageView
// pv 是属性控制,p 是 private, v 是 var,具体的列表可以在后文中查看; . 用于区分属性和类名
private var <#name#>: UIImageView
  • 可选属性
fv.UILabel?
// fv 是属性控制, f 是 fileprivate, v 是 var; ?表示属性是可选的
fileprivate var <#name#>: UILabel?
  • 有默认值的属性
Pl.UIView{}
// Pl 是属性控制, P 是 public, l 是 let; {} 表示有默认值
// 默认值使用 Class() 来生成
// 如果有默认值,就不会再显示类型,因为 Swift 可以自己推断类型
public let <#name#> = UIView()Pl.Int{100}
// 如果在 {} 里面添加默认值,会直接使用此默认值
public let <#name#> = 100
  • 懒加载属性
lv.UIButton
// lv 是属性控制,lv 是一个特殊的组合,分来时 l 表示 let, v 表示 var; 合并在一起时表示 lazy var
lazy var <#name#>: UIButton = {<#code#>
}()
  • OC可访问属性
@Pv.UIImageView
// 添加 @ 将把属性标记为 @objc
@objc public var <#name#>: UIImageView
  • 特殊的属性标识
 wv.EatProtocol?
// 添加 w 将把属性标记为 weak, 除了 w 之外,还有 u/unowned、 c/class 和 s/static
weak var <#name#>: EatProtocol?
  • 批量生成属性
pl.UILabel{} *2
// *2 中间不能有空格, 一般用于编写数据模型,或是编写 UI 时使用
private let <#name#> = UILabel()
private let <#name#> = UILabel()

Tips: 如果属性没有写标记,会自动使用 let 来标记属性

.UIImageView let <#name#>: UIImageView

Swift 属性标记快速查询表

符号 标记
l Let
v var
p private
P public
o open
f fileprivate
pl private let
pv private var
ol open let
Ov open var
fl fileprivate let
fv fileprivate var
lv Lazy var
@ @objc
u unowned
w weak
c class
s static

Objective-C属性生成

Objective-C 中的使用语法和 Swift 区别不大,主要是关键字和生成的样子不同

  • 单个属性
.UIImageView *
// 默认描述就是 nonatomic, strong
@property (nonatomic, strong) UIImageView *<#name#>
  • 生成完整属性
c.NSString *name;
// 如果在末尾添加 ' ; ' 表示 Class 后面已经衔接了属性名, 为了方便快速编码
@property (nonatomic, copy) NSString *name;

Tips: class 可以用来标记类属性

Objective-C 属性标记快速查询表

符号 标记
s strong
w weak
a assign
r readonly
g getter=<#getterName#>
c copy
n nullable
N nonnull
C class

生成约束代码

我选取了最常用的两个框架来实现, 在 Objective-C 中使用 Masonry,而在 Swift 当中使用 SnapKit。

SnapKit

  • 添加布局
 #snpm(iconView, e=self)// snpm 就是 makeConstraints, 在 () 中使用,号来分割各个语句// 第一个参数是要添加约束的对象,剩下的都是布局语句// 每个语句都分为三个部分,左边是被约束对象的属性,中间是约束方式,// 而右边是约束的值或是其它的约束对象iconView.snp.makeConstraints {$0.edges.equalTo(self)}
  • 更新布局
#snpu(iconView, h=100)
// snpu 是 updateConstraints
iconView.snp.updateConstraints {$0.height.equalTo(100)
}
  • 重置布局
#snprm(iconView, r=self - 20)
// snprm 是 remakeConstraints
iconView.snp.remakeConstraints {$0.right.equalTo(self).offset(-20)
}
  • 布局演示 1 (相对距离)
#snpm(iconView, r=titleLabel.l-20, wh=20)
// 更加直观的使用 + - 来进行相对距离的设置
iconView.snp.makeConstraints {$0.right.equalTo(titleLabel.snp.left).offset(-20)$0.width.height.equalTo(20)
}
  • 布局演示 2 (+-的作用)
#snpm(iconView, t=titleLabel.b-superView.height-20, wh=100)
// 在约束语句中,第一个加减号除了有正负的含义,还是分割前后语句的标记iconView.snp.makeConstraints {$0.top.equalTo(titleLabel.snp.bottom).offset(-superView.height-20)$0.width.height.equalTo(100)
}
  • 布局演示 3 (比例约束)
#snpm(iconView, wh=self/2)
// 进行比例约束也是常用的约束手法
iconView.snp.makeConstraints {$0.width.height.equalTo(self).dividedBy(2)
}// 相同作用
#snpm(iconView, wh=self*0.5)
// 使用 * 法当然也是可以的
iconView.snp.makeConstraints {$0.width.height.equalTo(self).multipliedBy(0.5)
}
  • 布局演示 4 (比较)
#snpm(titleLabel, tl=self, r<=self - 20)
// 常用的根据文本的长度自适应宽度
// 也可以使用 >= 表示大于等于titleLabel.snp.makeConstraints {$0.top.left.equalTo(self)$0.right.lessThanOrEqualTo(self).offset(-20)
}
  • 布局演示 4 (约束等级)
#snpm(iconView, l = self, r <= superView~20, r <= titleLabel.l - 20~h)
// 在约束语句的最后使用 ~ 可以用来设置约束登记
// 你可以使用数字来表示约束登记,也可以使用 r\h\m\l 来标记iconView.snp.makeConstraints {$0.left.equalTo(self)$0.right.lessThanOrEqualTo(superView).priority(20)$0.right.lessThanOrEqualTo(titleLabel.snp.left).offset(-20).priority(.high)
}

SnapKit 属性标记快速查询表

  • 属性
符号 属性
l left
t top
b bottom
r right
w width
h height
x centerX
y centerY
c center
s size
e edges
约束等级
r .required
h .high
m .medium
l .low
比较参数

=

greaterThanOrEqualTo
<= lessThanOrEqualTo
= equalTo
运算符号
- Offset(-value)
+ Offset(value)
* multipliedBy(value)
/ dividedBy(value)

Masonry

主要的用法和 SnapKit 一致, 下面主要说不同点

  • 创建、更新、重置
@masm(iconView, e=self)   // 创建
@masu(iconView, e=self)    // 更新
@masrm(iconView, e=self)  // 重置

Tips: 在 OC 中可以使用 @ 作为命令的前缀,主要是 # 在OC文件中会自动变第一列, 影响代码结构

  • 约束中没有 r 这个等级了
  • 比较里面新加了 == / >== / <==, 主要是相比少一个 = 的版本,在前面加上了 mas_
@masm(iconView, e=self)   // 创建
@masu(iconView, e=self)    // 更新
@masrm(iconView, e=self)  // 重置

视图的快速创建

这部分使用 Xcode 的代码块也可以实现,但是写代码的时候,打出了对应的短语后还要看一眼和等待Xcode反应实在是令人着急。我们为的就是快!!!并且我们可以直接赋予视图一个变量名,而代码块还是不行的

通过 #make 命令我们可以快速的添加创建一个 View 的代码

这是目前支持的创建类型

  • UIView
  • UILabel
  • UIButton
  • UIImageView
  • UITableView
  • UICollectionView
  • 普通创建 UIImageView

#make(UIImageView)
// 生成 Swift 视图
let <#name#>  = UIImageView()
<#name#>.backgroundColor = <#color#>
<#name#>.image = <#image#>
<#superView#>.addSubview(<#name#>)
// 生成 OC 视图
UIImageView *<#name#> = [[UIImageView alloc] init];
self.<#name#> = <#name#>;
<#name#>.backgroundColor = <#color#>;
<#name#>.image = <#image#>;
[<#superView#> addSubview: <#name#>];
  • 设置属性名创建 UILabel
@make(UILabel, titleLabel)
// 生成 Swift 视图
let titleLabel = UILabel()
titleLabel.font = <#font#>
titleLabel.textColor = <#color#>
titleLabel.text = <#text#>
titleLabel.backgroundColor = <#color#>
<#superView#>.addSubview(titleLabel)
// 生成 OC 视图
UILabel *titleLabel = [[UILabel alloc] init];
self.titleLabel = titleLabel;
titleLabel.font = <#font#>;
titleLabel.textColor = <#color#>;
titleLabel.text = <#text#>;
titleLabel.backgroundColor = <#color#>;
[<#superView#> addSubview:titleLabel];

创建方法

Swift

  • 创建方法
#func(eat)
// 生成一个简单的方法
func eat() {<#code#>
}
  • 设定权限的方法
#func(@p.run)
// 标记和属性一样
@objc private func run() {<#code#>
}
  • 有参数的方法
#func(run::)
// 一个 : 代表有一个参数
func run(<#name#>: <#type#>, <#name#>: <#type#>) {<#code#>
}
  • 有返回值的方法
#func(run>)
// 一个 > 代表有一个返回值
func run() -> <#return#> {<#code#>
}
// 多个返回值会返回元组
#func(run>>)
func run() -> (<#return#>, <#return#>) {<#code#>
}

Objective-C

  • 创建方法
#func(run)
// 生成一个简单的方法
- (void)run {<#code#>
}
  • 有返回值的方法
#func(run>)
// 一个 > 代表有一个返回值
- (<#type#>)run {<#code#>
}
  • 有参数的方法
#func(run::)
// 一个 : 代表有一个参数
- (void)run:(<#type#>)<#param0#> <#name1#>:(<#type#>)<#param1#> {<#code#>
}

通用语法功能

  • 批量处理: 以上所有的命令都可以通过后接 *n 进行批量的生成
  • 多命令执行: 你可以通过 + 连续的编写多句命令一块生成

希望大家提出宝贵的意见和建议, 你可以提出 issue 或是发邮件到 caishilin@yahoo.com

End

Xcode插件: 编码效率神器 FlyCoding相关推荐

  1. 那些不能错过的Xcode插件

    古人云"工欲善其事必先利其器".打造一个强大的开发环境,是马上提升自身战斗力的绝佳途径!下面是搜集的一些有力的XCode插件. 1.全能搜索家CodePilot 2.0 你要找的是 ...

  2. Swift JSON转模型Xcode插件

    SwiftJSONModeler是一个Xcode插件,一键转换json字符串为Swfit模型,一键转化 YApi 平台接口为模型,并且自动引入注释. 支持struct, class 支持单json转模 ...

  3. HokeyPokey — WWDC讲师特供XCode插件高仿版的设计与实现

    在我们使用XCode IDE做iOS技术分享的时候,经常会涉及到多个方案的运行效果比较.切换不同的演示方案通常有如下三种方法:1.分成多个XCode项目:2.分成多个版本Branch 3.手动去注释掉 ...

  4. 动手自己写一个 xcode 插件(Xcode Source Editor Extensions)附源码

    2019独角兽企业重金招聘Python工程师标准>>> 动手自己写一个 xcode插件  (暂时需要注释功能,所以简单的写一个注释插件) -----Xcode Source Edit ...

  5. 升级OS10.11系统后 Xcode6.4的变化少了个按钮 could not launch “Xcode” Xcode 插件安装...

    升级OS10.11系统后 Xcode6.4的变化少了个按钮 could not launch "Xcode"  Xcode 插件安装 A:  升级10.11后Xcode 左上角模拟 ...

  6. xcode扩展_如何将Xcode插件转换为Xcode扩展名

    xcode扩展 by Khoa Pham 通过Khoa Pham 如何将Xcode插件转换为Xcode扩展名 (How to convert your Xcode plugins to Xcode e ...

  7. 部分xcode插件可能有新版本

    推荐博客主人:http://blog.csdn.net/liwei3gjob/article/details/44266943 古人云"工欲善其事必先利其器",打造一个强大的开发环 ...

  8. iOS开发UI篇—推荐两个好用的Xcode插件(提供下载链接)

    iOS开发UI篇-推荐两个好用的Xcode插件(提供下载链接) 这里推荐两款好用的Xcode插件,并提供下载链接. 一.插件和使用如下: 1.两款插件 对项目中图片提供自动提示功能的插件:KSImag ...

  9. Xcode 插件失效的临时解决方案

    每当Xcode升级之后,都会导致原有的Xcode插件不能使用,这是因为每个插件的Info.plist中记录了该插件兼容的Xcode版本的DVTPlugInCompatibilityUUID,而每个版本 ...

最新文章

  1. Python面试题集合
  2. php mysql多重筛选,如何使用php、html、mysql构建一个多重分类选择列表
  3. css绘制卡券优惠券_css3 绘制优惠券
  4. jquery-migrate.js
  5. 【Python基础】Python 打基础一定要吃透这 5 个内置函数
  6. Unity C#笔记 协程详解(转)
  7. wxpython图形_wxPython(Python的GUI图形库)v3.0.2.0免费版-独木成林
  8. 多米诺骨牌(洛谷-P1282)
  9. 字符串逆序(信息学奥赛一本通-T1162)
  10. Java讲课笔记09:类与对象
  11. html+css做的丝带标签
  12. OpenSceneGraph FAQ
  13. Django Book 中对于MVC的阐释
  14. NPDP产品经理认证:创新性解决问题方法(TRIZ)的工具与应用
  15. 破解IntelliJ IDEA 2017.1到2099年
  16. html中微信添加好友超链接,微信给文字加链接代码分享(原来微信超链接是这样加的)...
  17. 超参数调整的方法介绍
  18. SpamSieve for Mac(垃圾邮件过滤软件)
  19. 计算机的收获初一作文,初一开学一个月的收获和感受作文
  20. 往数组里面添加对象,往对象里面添加元素

热门文章

  1. 一款好用的网络骗子举报系统无加密版本源码
  2. arcgis 栅格数据 邻域计算_ArcGIS空间分析基本操作
  3. html 图像旋转180度
  4. 从GDC下载数据集、svs无损转png
  5. Winform控件镂空、窗体本身镂空和鼠标击穿(录屏会用到)
  6. 昆仑通态复制的程序可以用吗_昆仑通态mcgs触摸屏的六大种类及其特点(1)
  7. Eclipse Web项目目录详解
  8. oracle saiku_多维数据分析引擎Saiku的安装使用
  9. Go语言 一级函数 --- 匿名函数、高阶函数、闭包
  10. 怎样刷新系统图标缓存?