Pluto Y

嗨,我叫章龙华,一名由Java EE转到iOS的程序猿。不断的修行与前进,喜欢学习新的知识,寻找志同道合之人。不断努力着,为了明天的更轻松。

装个逼:自定义三元运算符

最近刚看完@喵神翻译的函数式Swift这本书(有兴趣的小伙伴可以去买来看看,记得支持正版哟~),然后就想说说 Swift 中的自定义操作符,这个在函数式编程中也是非常有意义的工具。例如在 Applicative Functor 中的 <*> 和 Monad 中的 >>= 在我们自己实现函数式编程中都有可能需要自定义来实现这两个操作符。另外,除了在函数式编程里,我们平常的编程工作中也有经常遇到需要重载或者自定义操作符的时候,例如实现了 Equatable 协议的情况下就需要重写 == 操作符。 但是这里并不是手把手教你如何自定义操作符,而是来说说在 Swift 2 和 3 中自定义操作符有什么不同吧,至于英文好的小伙伴可以参考SE-0077。 在 Swift 2 的情况下,我们通常通过下面的代码来定义自己的操作符: // Swift 2 infix operator || { associativity: left precedence: 140 } func ||<…

阅读全文

代表月亮私有你

"你问我爱你有多深, 我爱你有几分, 我的情不移, 我的爱不变, 月亮代表我的心",既然月亮代表我的新,是不是说明了我的要私有你?哈哈开玩笑,我们来说一个装逼的东西~ 我们在写OC的过程中经常有这么一种情况,就是我们需要写一个单例的情况。当然我们都会提供一个类方法类似于+(instancetype)sharedInstance之类的方法,巴特(but)我们的类的开山鼻祖都是NSObject,而这个鼻祖竟然提供了- (instancetype)init让别人来调用。这样宝宝就不开心了,宝宝很委屈,可是宝宝不说,我就是想让别人调用我的类方法来获得单例嘛~(呕吐~) 那么我们有没有办法让init方法私有化呢?或者是让小伙伴不要去调用它呢?答案是木有,因为我们知道OC没有私有化父类方法的做法,并且OC有非常强大的Runtime机制,致使我们没有办法私有化init方法。通常这个时候都会有个但是,要不然还写这篇文章干嘛。 其实虽然没有完全私有init的方法,但是我们可以通过一些手段来私有化它,让我们来一个一个的看看吧。 首先,我们可以用Clang的Attributes中的unavailable来让产生一个编译错误。怎么做呢?简单的要命,只要添加如下的声明即可: - (instancetype)init __attribute__((unavailable("Disabled. Use +sharedInstance instead"…

阅读全文

UIButton是一个类簇(Class Clusters)?

类簇用通俗一点讲就是一个public的抽象类加上一些private的私有类构成的,它是对一些实现细节进行隐藏,而对外公开的行为进行统一的一种设计。相信大家在平常工作中多少有注意到一些蛛丝马迹。例如我们常用的NSNumber, NSArray, NSDictionary以及NSString等,而这些都是总所周知。 然而就UIButton是不是类簇,本王就纠结了。To be or not to be, that's a question. 这时候就应该装逼了,搬出莎士比亚这句话。 顺带就带着这个来说说类簇的问题。关于为什么纠结呢?因为很多地方包括书籍都提到UIButton是类簇,而我再Stack Overflow却找到这样一段话: UIButton is not a class cluster at all. A class cluster is represented by a public abstract class, that means no instance variables, with…

阅读全文

对象关联(Associated Object)

经常看片的小伙伴肯定听一群坏蛋说过这一句话,我们还会回来的~~咳咳,不好意思,说错了,是我们是绑在一条绳子上的蚂蚱。而这个跟我们今天说的主题有点像,因为我们是要将一个对象绑定到另一个对象上~ 那么不废话,新来看看今天的素材都有哪些吧: // <objc/runtime.h> void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy) id objc_getAssociatedObject(id object, const void *key) void objc_removeAssociatedObjects(id object) 首先可以看到最开始的<objc/runtime.h>知道如果要用要建立关联的话,首先要引入这个头文件。其次,…

阅读全文

枚举(Enum)

枚举估计是大家工作中经常打交道的一种类型,那么在OC和Swift中我们经常如何用它的呢?综合多方面的使用,我们大体可以将枚举分为两种方式,一种是普通的枚举,还有一种不普通的枚举(我屮艸芔茻,你这不是废话吗~),诶,第二种应该说是枚举中的各种可能同时存在,如果换成代码的语言就是枚举中的各个值有可能进行位操作运算的。那么在代码里面分别如何表示呢? OC中将这两种分别用NS_ENUM与NS_OPTIONS来区分,而Swift中则用普通的enum以及OptionSetType来搞定。那么该如何使用以及在使用过程中有什么需要注意的呢?且听下回分解(分解你大爷啊!) 咳咳,首先我们先来看看NS_ENUM以及NS_OPTIONS是个什么东东吧~ #if (__cplusplus && __cplusplus >= 201103L \ && (__has_extension(cxx_strong_enums) \ || __has_feature(objc_fixed_enum)) \ ) || \ (!__cplusplus && __has_feature(objc_fixed_enum)…

阅读全文