Elwin Frederick

  • Home

  • Archives

什么是 Mixins ?

Posted on 2020-07-02 | In Geek

在 Dart ( Also Flutter ) 中 , 什么是 Mixins

作者 Romain Rastel

原文地址(科学上网)

译者 : ElwinFrederick

译者注 :
在学习 flutter 的时候 , 对于 诸如 SingleTickerProviderStateMixin , ProviderStateMixin 很不理解 ,
而在网上的书籍教程之类的对于 mixin 几乎都是一句话带过 , 并不多讲 .
现今又被人问起 , 讲了很久才明白 = = …
科学上网找了很久 , 发现了这篇文章 .
讲的很好 , 然而并没有中文 , 所以我就翻译下


译文

当我 开始学习 Dart , mixins 的概念对于我来说是全新的 . 我从 C# 这个没有 mixins 的地方转到 Dart (据我所知至少 C# 8.0 之前) .
最开始 , 我发现这个概念不知怎么的很难懂 , 直到我认识到了它是多么的强大 .

声明 : Mixins 在 Dart2 被引入 , 以下的一些内容可能在你读到的时候已经不太适用了 .
(译者注: 概念还是相通的)

🤔 为什么需要 mixins ?

例如 C# 之类的语言压根没有 mixins , 可能是没那么有用 … 吗?
让我们来看看下面的继承树 :

示例图表 1

这里有一个拥有三个子类 (Mammal (哺乳动物) , Bird (鸟类) 和 Fish (鱼类)) 的祖类称之为 Animal(动物) .
在底部 , 我们构造了一些类 . 那些小方块代表了行为 .
例如 , 蓝色的方块代表了这个类拥有这个行为的实例可以 swim (游泳)

一些动物有一些共同的行为 : Cat (猫) 和 dove (鸽子) 都可以步行 , 但是猫不可以飞 (Nyan Cat(彩虹猫)除外) (译者注 , 链接是油管视频 , 需科学上网)

这些行为在这个类中是相互交错的 , 所以我们不能再这些类的父类中实现这些行为 .

如果一个类可以有超过一个父类 , 这就很容易了 . 我们可以创建三个其它的类 Walker (步行) , Swimmer (游泳), Flyer (飞行)
之后 , 我们可以将 Dove (鸽子) 和 Cat (猫) 继承自 Walker (步行) 类 .
但是 在 Dart 中 , 每个类 (除了 Object) 只有一个父类 . (译者注 , 单继承)

除了继承自 Walker (步行) 类 , 我们可以实现一个类似接口 , 但是我们要实现在很多类中实现很多次 . 所以这不是个好的解决办法 .

我们需要一种可以在多个类别中 , 多次复用一个类中代码的方法 .
猜猜看? Mixins 就是为此而生的 .

Mixins are a way of reusing a class’s code in multiple class hierarchies. (译者注 , 这里不翻译了 , 原汁原味)
—dartlang.org

这么形容 , 是否就感觉容易了呢 😁?

🔒 限制

mixins 有一些限制 (源自: dartlang.org)

· Dart 1.12 或更低版本的 , 支持 mixins 必须扩展自(extend) Object , 而且不能 调用 super().
· Dart 1.13 或更高 , mixins 可以在 Object 之外扩展 , 也可以调用 super.method(). 这个仅仅在 默认的 Dart VM 和 带参的 Analyzer (译者注 , 是 Dart 的静态代码分析器) . 更确切的说 , 是在命令行工具调用 analyzer 加上 --supermixin . 这个也同样在服务器中有效 , 在客户端配置的选项中 . Dart2js 和 dartdevc 不支持 此类调用 .
· 在 Dart 2.1 中 , mixins 限制减少 . 例如 , Flutter 支持 mixins 调用 super() , 也同样支持扩展自除了 Object 类之外的其他类. (译者注 , 划重点 , 敲黑板!) . 但语法似乎在所有 Dart SDK 支持之前就有所改变 . 更多细节 , 参考 mixin

📝 语法

我们见识到了 mixins 的有用之处 , 现在看一下如何创建和使用他们 .

Mixins 隐式的声明在了 平常的类 中

1
2
3
4
5
class Walker {
void walk() {
print("I'm walking");
}
}

如果我们想避免 mixin 被实例化或被扩展 , 我们可以这样定义

1
2
3
4
5
6
7
8
abstract class Walker {
// 这个类已经被当做 mixin 来使用 , 所以它不应当被直接扩展
factory Walker._() => null;

void walk() {
print("I'm walking");
}
}

若想使用 mixin , 使用 with 关键字 , 用来跟随一个或者多个 mixin 声明

1
2
3
class Cat extends Mammal with Walker {}

class Dove extends Bird with Walker, Flyer {}

在 Cat 类中 定义 Walker mixin , 这样允许我们直接调用 walk 方法 而不是 fly 方法 (在 Flyer 中定义)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
main(List<String> arguments) {
Cat cat = Cat();
Dove dove = Dove();

// 猫可以走路
cat.walk();

// 鸽子可以走和飞
dove.walk();
dove.fly();

// 一只普通的猫不会飞
// cat.fly(); // 取消注释 , 编译不通过
}

🔎 细节

我告诉你这个概念有些难以理解 , 但是到现在为止也不是那么难 , 不是嘛 ?

唔 … 那么你能告诉我下列程序的输出结果是什么么 😵 ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class A {
String getMessage() => 'A';
}

class B {
String getMessage() => 'B';
}

class P {
String getMessage() => 'P';
}

class AB extends P with A, B {}

class BA extends P with B, A {}

void main() {
String result = '';

AB ab = AB();
result += ab.getMessage();

BA ba = BA();
result += ba.getMessage();

print(result);
}

其中 , AB 和 BA 扩展自 P 类 , with 上了 A 和 B mixins , 但是是不同顺序的 .
这三个类 A , B 和 P 都有一个叫做 getMessage 的方法 .

首先 , 我们在 AB 类中调用 getMessage , 然后调用 BA 的 getMessage .

那么 , 输出结果是什么呢 ?
我提供了五个建议选项

A. 无法编译
B. BA
C. AB
D. BAAB
E. ABBA


🥁🥁🥁 答案是 B ! 程序输出 BA.

我想你猜到了 , mixins 的声明顺序是非常重要的 .

为什么呢 ?

✨ 线性

当你在类中遵循了 一个 mixin , 这样想

在 Dart 中 , Mixins 是通过在父类的实现之上创建一个新的类
并不是在 “旁边” , 而是在父类 “之上” , 所以在路由 (译者注 , 继承链) 上就没有歧义
(译者注 , 实际上就是在 父类 和 子类 之间创建了桥接类 , iOS 中的 NSProxy 也是类似的模拟实现多继承)
— Lasse R. H. Nielsen on StackOverflow.

实际上 , 代码

1
2
3
class AB extends P with A, B {}

class BA extends P with B, A {}

在语义上相等于

1
2
3
4
5
6
7
8
9
class PA = P with A;
class PAB = PA with B;

class AB extends PAB {}

class PB = P with B;
class PBA = PB with A;

class BA extends PBA {}

最终的继承树可以被这样表示 :

示例图表 2

新类在 AB 和 P 之间被创建. 这些新类是 mix-in (混合) 在父类 P 和 A , B 类之间

所以 , 这里并没有多继承 .

Mixins 并不是一种实现多继承的方式 ,
Mixins 是一种可以抽象出且复用的一种 “操作” 或者 “状态” 的集合
它和扩展复用的类很像 , 但它可以适配单继承 , 因为它是线性的
— Lasse R. H. Nielsen on StackOverflow.

重要的一点是 , 记住 mixins 被声明的顺序代表了继承链 , 从最顶端的祖类到最底部 .

📄 类型

mixin 的实例类型是什么 ?
简单来说 , 它是其父类的子类型 , 同时也是 mixin 名称所指示的类型 ,
即为 , 原来的类型 .
(译者注 , 遵循 mixin 的实例的类型是 , 它的父类类型 与 它所遵循的 mixin 类型 , 因为有中间层 , 所以均为其子类)
—dartlang.org

这就意味着这个程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class A {
String getMessage() => 'A';
}

class B {
String getMessage() => 'B';
}

class P {
String getMessage() => 'P';
}

class AB extends P with A, B {}

class BA extends P with B, A {}

void main() {
AB ab = AB();
print(ab is P);
print(ab is A);
print(ab is B);

BA ba = BA();
print(ba is P);
print(ba is A);
print(ba is B);
}

将会在控制台输出六行 true

细节解释

Lasse R. H. Nielsen 给了我一个非常棒的解释

因为每个 mixin 都创建一个新类 , 它也创建了新的 接口 (因为所有 Dart 类都定义接口)
就像形容的那样 , 新类扩展自 父类 , 也包括 (copy) 了 mixin 类的 副本 .
但是它同时也实现了 mixin 类的接口

在大多数的情况下 , 没有方法可以查到 mixin 的类 或者 其接口
Super with Mixin 类只是一个匿名父类 (声明类似 class C extends Super with Mixin {}) ,
如果你像是用 class CSuper = Super with Mixin {} 命名了一个 mixin ,
那么你可以查到这个 mixin 的类或者其接口 , 同时 , 它也是 父类 和 Mixin 类的子类 .

— Lasse R. H. Nielsen

🙄 什么时候使用 mixins ?

在我们想在多个类之间去共享一个行为 , 且不具备相同的继承时 ,
或者在父类中实现这个行为很另类时 , 会非常有用 .

在解析(例如 jaguar_serializer ) 或储存中很常见 ,
但你也可以使用 mixins 去提供一些 工具方法 (例如 Flutter 中的 RenderSliverHelpers) .

📈 Mixins 在进步 (规范)

如果你对 Dart 语言的发展感兴趣 , 你应该知道它的规范将在 Dart 2.1 中改进 .
他们也很欢迎你反馈使用建议.
详细的信息, 请移步这里.

给你一个瞥见未来的机会 , 思考一下这个源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
abstract class Super {
void method() {
print("Super");
}
}

class MySuper implements Super {
void method() {
print("MySuper");
}
}

mixin Mixin on Super {
void method() {
super.method();
print("Sub");
}
}

class Client extends MySuper with Mixin {}

void main() {
Client().method();
}

第 13 到 18 行的 mixin 声明 , 指出了一个父类的限制 .
这就意味着 , 如果一个类要遵循这个 mixin , 这个类必须扩展 或者 实现自 Super ,
因为这个 mixin 使用的是 Super 提供的 特征 .

这个程序的输出是 :

1
2
MySuper
Sub

如果你想知道为什么 , 请记住 mixins 是线性的 .

示例图表 3

实际上 , 在 15 行 调用 super.method() 是调用 第 8 行 的方法 .

🐬 完善 最开始的 动物 例子

你可以在下方代码中找到 我用来解释 mixins 的 Animal 的完整例子 .

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
abstract class Animal {}

abstract class Mammal extends Animal {}

abstract class Bird extends Animal {}

abstract class Fish extends Animal {}

abstract class Walker {
// 这个类作为 mixin , 不应该被直接扩展
factory Walker._() => null;

void walk() {
print("I'm walking");
}
}

abstract class Swimmer {
// 这个类作为 mixin , 不应该被直接扩展
factory Swimmer._() => null;

void swim() {
print("I'm swimming");
}
}

abstract class Flyer {
// 这个类作为 mixin , 不应该被直接扩展
factory Flyer._() => null;

void fly() {
print("I'm flying");
}
}

class Dolphin extends Mammal with Swimmer {}

class Bat extends Mammal with Walker, Flyer {}

class Cat extends Mammal with Walker {}

class Dove extends Bird with Walker, Flyer {}

class Duck extends Bird with Walker, Swimmer, Flyer {}

class Shark extends Fish with Swimmer {}

class FlyingFish extends Fish with Swimmer, Flyer {}

这里我们可以看到这些 mixins 的线性过程 :

示例图表 4

📗 结论

至此我们知道了 mixins 是一个很强大的概念 , 它可以让你 在多类多层级中 复用代码 .

Flutter 在很多地方使用了这个特性 . 我发现 , 理解 mixins 很重要 ,
这也是为什么我在这里和你分享我的理解 .

如果你有什么疑问 , 请不要吝惜 👇.

欢迎任何反馈 .

如果你觉得不错 , 可以点击下方 的 👏 .
(译者注 , 这是 flutter 社区的 , 可以点击上方原文链接中的 👏 来支持作者)


原作者 : Romain Rastel
原发布时间 : 2018 . 09 . 16
阅读时长 : 7 分钟

任何交流欢迎邮件至 elwinfrederick@163.com

MQExtensionKit ChangeLog (English)

Posted on 2019-02-22 | Edited on 2020-06-12 | In Geek

MQExtensionKit ChangeLog



2020-06-12 10:50:00

IMPORTANT for the Realm database’s aggressive update , MQDataBase’s development will be temporarily pasued since 4.1.9 , and removed from MQExtensionKit.

2019-08-24 15:32:00

updated NSString+MQExtension for some localized methods , deprecated some methods in NSPredicate+MQExtension.

2019-06-14 12:22:00

updated NSString+MQExtension to fix a bug that cause filter ineffective for Chinese Character “一” .

2019-05-22 11:51:00

added CLLocation+MQExtension && CLGeocoder+MQExtension (MQData) for location-related operations.

2019-02-22 14:01:38

added MQVideo_H264_HEVC_Encoder && MQVideo_H264_HEVC_Decoder (MQMedia) for video hardware encode && hardware decode .

2018-12-26 14:44:04

added MQRouter (MQRouter) .

2018-08-13 16:22:06

added NSError+MQExtension (MQData) .

2018-08-02 14:04:53

added MQMultiArgumentPerformer (MQOrigin) for perfoming a selector with multi arguments .

2018-08-02 11:03:05

added SVProgressHUD+MQExtension (MQCustom) for notification issues.

2018-07-30 12:52:51

using new prefix MQ .

2018-07-09 17:37:21

added NSLock+MQExtension (MQData) for lock issues .

added MQNull (MQOrigin) for replace NSNull holding issues .

2018-06-27 20:03:04

added MQPointMarker (MQOrigin) for collect infos on our own ,

added MQCrashCatcher (MQOrigin) for catch crashes ,

added MQPhotoManager (MQOrigin) for pick photos / videos in album ,

added MQAudioRecorder (MQOrigin) for recording audios .

2018-06-25 19:22:00

added MQTaskManager (MQOrigin) for easy queue tasks .

2018-05-04 21:55:33

added MQAuthentication (MQCommon) for touch id && face id verify , MQIAPManager(MQOrigin) for in app purchase .

2018-04-23 18:53:35

make prefix all mq_ . remove MQDataBase && MQCustom from MQFull .

2017-12-22 15:59:44

translate all comment in header file into chinese .

2017-11-28 12:39:59

rebuilt MQBridgeWrapper in MQRouter .

2017-11-01 19:24:27

fix annoying warnings under Xcode 9.

2017-09-15 17:56:19

rename ‘CCLocalLib’ to ‘CCExtensionKit’ .
updated to ‘3.0.0’

2017-08-10 14:50:52

After writing CCChainOperate for almost a month , I figured , that , THIS CAN BE A KIT !

Therefore , CCChainKit was created . 👏👏👏 .

👉👉👉 CCChainKit
probably I won’t update CCChainKit for a long time , I don’t have that time or energy to continue contribute on two repos .

2017-08-06 15:38:09

Well … I found that local libraries have some issues on spec dependency . Therefore , CCLocalLib was no longer a local lib.
👏👏👏 -> now , jusy run pod 'LocalLib' and cocoapods will do the rest .

2017-07-01 19:49:01

I wrote a new library called CCChainOperate .
Why I wrote it ?

well , after years of writing objective-c , i figured some dis-advantage of it . such as you have to use [] everywhere . i just hate that .

but , as we all know , on the opposite side , swift was much better , easily to use , simple to unsderstand (though its haven’t stable yet).

Someday , i find , that block , can actually can perform a style like swift , therefore CCChainOperate was born (not complete yet , maybe , forever , but I’ll try.).

Also , heavily inspired by react-Objc .

MQExtensionKit ChangeLog (中文)

Posted on 2019-02-22 | Edited on 2020-06-12 | In Geek

MQExtensionKit ChangeLog



2020-06-12 10:50:00

重要 因为 Realm 的激进式更新 , MQDataBase 将从 4.1.9 版本开始暂时停止更新 , 并被移除出了 MQExtensionKit

2019-08-24 15:32:00

更新 NSString+MQExtension 中一些本地化方法 , 废弃了 NSPredicate+MQExtension 中一些方法 .

2019-06-14 12:22:00

更新 NSString+MQExtension 修复了汉字 “一” 过滤失效的问题

2019-05-22 11:51:00

添加 CLLocation+MQExtension && CLGeocoder+MQExtension (MQData) 来做地理相关操作

2019-02-22 14:01:38

添加 MQVideo_H264_HEVC_Encoder && MQVideo_H264_HEVC_Decoder (MQMedia) 用来 硬编码 / 硬解码 视频 .

2018-12-26 14:44:04

添加 MQRouter (MQRouter) .

2018-08-13 16:22:06

添加 NSError+MQExtension (MQData) .

2018-08-02 14:04:53

增加 MQMultiArgumentPerformer (MQOrigin) 用来 perform 并携带多个参数 .

2018-08-02 11:03:05

增加 SVProgressHUD+MQExtension (MQCustom) 的通知处理 .

2018-07-30 12:52:51

使用新的前缀 MQ .

2018-07-09 17:37:21

增加 NSLock+MQExtension (MQData) 针对锁相关.

增加 MQNull (MQOrigin) 用来替换 NSNull 空值占位 相关 .

2018-06-27 20:03:04

增加 MQPointMarker (MQOrigin) 来让自己收集信息 ,

增加 MQCrashCatcher (MQOrigin) 以捕获崩溃 ,

增加 MQPhotoManager (MQOrigin) 用来从相册选择 图片 / 视频 ,

增加 MQAudioRecorder (MQOrigin) 用来录音 .

2018-06-25 19:22:00

增加 MQTaskManager (MQOrigin) 简易队列任务.

2018-05-04 21:55:33

增加 MQAuthentication (MQCommon) 用来做指纹 / 面部验证 , MQIAPManager(MQOrigin) 用来做内购相关 .

2018-04-23 18:53:35

更换所有的前缀为 mq_ , 将 MQDataBase 和 MQCustom 从 MQFull 中移除

2017-12-22 15:59:44

将头文件中所有的注释都翻译成汉语 .

2017-11-28 12:39:59

重构 MQRouter 中的 MQBridgeWrapper .

2017-11-01 19:24:27

修复 Xcode 9 下烦人的警告.

2017-09-15 17:56:19

将 ‘CCLocalLib’ 重命名为 ‘CCExtensionKit’ .
更新到 ‘3.0.0’

2017-08-10 14:50:52

在差不多写了一个月的 CCChainOperate 之后 , 我发现 , 它 , 可以成为一个开发库 !

所以 , CCChainKit 就诞生了 . 👏👏👏 .

👉👉👉 CCChainKit
CCChainKit 可能会很长一段时间不再更新了. 维护两个库确实没精力 .

2017-08-06 15:38:09

呃 … 我发现 , 本地库在依赖一些其它的第三方库上有一些问题 , 所以 , CCLocalLib 不再是一个本地库了 .
👏👏👏 -> 现在 , 仅仅是 pod 'LocalLib' , cocoapods 就会帮你完成剩下的工作.

2017-07-01 19:49:01

我创建了一个叫做 CCChainOperate 的新库 , 我为啥写他?

嗯 , 在写了 OC 几年之后 , 我发现它还是有许多不足的地方的 . 比如你必须在几乎所有地方使用 [] . 我不喜欢 .

但是 , 我们都知道 , 相对的 , swift 就做的比它好 , 简单使用 , 容易理解 (现在还不太稳定就是了).

某天 , 我发现 , 经常使用的 block , 实际上是可以用来模仿 swift 的风格的 , 所以 CCChainOperate 就诞生了 (目前还没完成 , 可能 , 永远也不会 , 但是我会努力尝试的.).

当然 , 受到了 React-Objc 的很大启发.

Hello World

Posted on 2018-12-27 | In 叨叨

以后在 GitHub 叨叨吧

以前总是不写博客 . 想想 . 还是 在 GitHub 部署一个吧 .

博客创建时间 : 2018年08月15日17:09:55

MQExtensionKit 中文文档

Posted on 2018-12-27 | Edited on 2020-06-12 | In Geek

MQExtensionKit

一些以 Objective-C 书写的为 iOS 添加的自定义类库.

Version

License

Platform

当前版本 4.1.9

pod ‘MQExtensionKit’ , ‘~> 4.1.9’ // 默认是 MQCore

pod ‘MQExtensionKit/MQFull’ , ‘~> 4.1.9’ . 如果你想安装整个框架.

Warning

CCExtensionKit 在版本 3.7.0 后就失效了

因为版本3.7.0之后 , CCExtensionKit 被重命名为 'MQExtensionKit' .

CCLocalLib 在版本 2.2.3 后就失效了

因为版本3.0.0之后 , CCLocalLib 被重命名为 'CCExtensionKit' .

MQExtensionKit 引入了 AdSupport.framework

所以 , 当你提交应用到 App Store 的时候要注意 .

Note

安装的时候 , 默认是 MQCore , MQCore 包含了

MQCommon (宏) , MQProtocol (协议) , MQData (NS族群), MQView (UI 族群), MQRuntime (objc/ runtime 相关)

如果你想安装全部 , 安装 "MQExtensionKit/MQFull" . (MQFull 包含了 MQCore , MQRouter , MQOrigin)

说明

MQCore : 核心拓展 . 一个抽象集合.

MQFull : 完整的 扩展 (包含 MQCore , MQRouter , MQOrigin) . 一个抽象集合 .

MQCommon : 宏 和 公共的工具类 .

MQProtocol : MQProtocol . 为了 MQ . 让所有 NSObject 的子类都遵循它 .

MQData : NS 族群类库 .

MQView : UI 族群类库 .

MQOrigin : 一个由自己开发的自定义视图 / 媒体 / 数据 库.

MQRouter : 组件化路由 , 其中 wrapper 依赖了 MGJRouter (‘~> 0.9.3’) .

MQMedia : 多媒体操作 . 视频 , 音频 , 图像 , 等等 …

MQDataBase : Realm (‘~> 3.7.5’) && && FCModel 的包裹 .

注意: 因为 Realm 的激进式更新 , MQDataBase 将从 4.1.9 版本开始暂时停止更新 , 并被移除出了 MQExtensionKit.

MQCustom : 一些自定义的类和功能 , 依赖或者基于一些其它的第三方 .

设计思路

最核心的设计思路是 无侵入性 , 即为 , 不通过任何动态方式 , 更改与原生有关的 API . (没有方法替换 , 没有路径更改等 … ) , 旨在以原生为基础 , 在其之上通过各种 非侵入 方式实现便利操作 .

上新 ?

请移步 ChangeLog .

示例

若想运行示例, 克隆 repo, 在工程文件夹内先运行 pod install .

要求

已经在 pod spec 中完成了.

安装

MQExtensionKit 已经上传到了 CocoaPods. 若安装,只需要在你的 Podfile 添加下列代码:

1
pod "MQExtensionKit"

作者

ElwinFrederick, elwinfrederick@163.com

许可协议

MQExtensionKit 收到 MIT 协议保护. 详细请查看工程中的 LICENSE 文件.

MQExtensionKit Docs (English)

Posted on 2018-12-27 | Edited on 2020-06-12 | In Geek

MQExtensionKit

Some custom categories for iOS with Objective-C.

Version

License

Platform

Current Version 4.1.9

pod ‘MQExtensionKit’ , ‘~> 4.1.9’ // default is MQCore

pod ‘MQExtensionKit/MQFull’ , ‘~> 4.1.9’ . if you wanna install the whole Kit .

Warning

CCExtensionKit has no longer effect after version 3.7.0

cause after 3.7.0 , CCExtensionKit was renamed to 'MQExtensionKit' .

CCLocalLib has no longer effect after version 2.2.3

cause after 3.0.0 , CCLocalLib was renamed to 'CCExtensionKit' .

MQExtensionKit had import the AdSupport.framework.

therefore , be ware when submit your app to App Store .

Note

when install , default is MQCore , MQCore contains

MQCommon (Macros) , MQProtocol (Protocol) , MQData (NS Family), MQView (UI Family) .

when you wanna get to Full , install with "MQExtensionKit/MQFull" . (MQFull contains MQCore , MQRouter , MQOrigin)

Instructions

MQCore : Core extensions . a abstract collection .

MQFull : Full extensions (contains MQCore , MQRouter , MQOrigin) . an abstract collection .

MQCommon : Macros && Common tools .

MQProtocol : MQProtocol . for MQ . make all the sub-class of NSObject conforms to it .

MQData : a extension actions for NS family .

MQView : a extension actions for UI family .

MQOrigin : a kit that for develop for custom views / medias / datas .

MQRouter : a router for module developing . and “wrapper” was depended on MGJRouter (‘~> 0.9.3’) .

MQMedia : Media operate . video , audio , images , etc …

MQDataBase : Wrappers for Realm (‘~> 3.7.5’) && FCModel

note: due to the Realm‘s aggressive update , MQDataBase’s development will be temporarily pasued since 4.1.9 , and removed from MQExtensionKit.

MQCustom : Custom classes or functions , dependend or based on other vendors .

Design instruction

The most important was non-invade , which is , Can't change any original API through any DYNAMIC operates . (no method swizz (implement swap) , no search-path changed) , Make it based on the original APIs , and through non-invade ways to achieved convenient functions .

What’s new ?

See ChangeLog .

Example

To run the example project, clone the repo, and run pod install from the Example directory first.

Requirements

Already done in pod spec.

Installation

MQExtensionKit is available through CocoaPods. To install
it, simply add the following line to your Podfile:

1
pod "MQExtensionKit"

Author

ElwinFrederick, elwinfrederick@163.com

License

MQExtensionKit is available under the MIT license. See the LICENSE file for more info.

冯明庆

6 posts
2 categories
© 2020 冯明庆
Powered by Hexo v4.2.1
|
Theme – NexT.Muse v6.4.0