Skip to content

Instantly share code, notes, and snippets.

Avatar
💭
Git gud!

Leo superarts

💭
Git gud!
View GitHub Profile
View yaml-playground.yml
# Convert by http://www.yamllint.com/
#
# FLAT
#
- &UPLOAD_ASSET
name: Upload PDF Asset
if: success()
uses: actions/upload-release-asset@v1
env:
@superarts
superarts / Swift值类型.md
Last active Aug 20, 2019
为什么说Swift的值类型是一个好的设计
View Swift值类型.md

印象中王垠跟胡正一样是个奇人,不过今天论事不论人,只评论一下他的这篇老文章“Swift 语言的设计错误”。因为版权问题,只贴一下链接:

http://www.yinwang.org/blog-cn/2016/06/06/swift

这篇文章虽然标题很大,但只说了一个具体问题:王垠认为,把array变成值类型用来解决可变性问题不是一个好的解决方法。我不知道他的想法到现在有没有改变,但我的看法跟他完全相反:string、array、dictionary作为值类型,是积极的改变,是让swift这个“2010后”超越上一代语言Java、C#的重要特征。

首先我们要明白,为什么Java、C#等语言会把复杂数据类型作为引用。是因为程序员都觉得它们本来就应该是引用吗?恰恰相反,是因为在实现上,引用类型符合计算机的工作方式。引用本质上就是指针,不同的引用指向同一个内存地址。C语言的指针可不是因为符合人类的思维方式,恰恰相反,是因为这种实现方式最为简洁。要把复杂类型作为值类型,需要付出更多的工作(深层拷贝),花费更多的CPU时间,占用更多的内存。对于可以用于不同平台的C来说,要在几K内存的八位单片机上,把这种设计当成默认的工作方式,显然是不合理的。

但是可以运行慢得要死的Java虚拟机的现代手机等硬件来说(Java爱好者肯定能拿出一百个例子来说明Java并不慢,我一直不明白,byte code和垃圾回收这种机制不可能在所有场合下都能取得比机器代码加引用计数同样的效率这点,怎么会有人不明白,而且下文会说,并不是机器效率越高,一个语言就越成功),值类型在大多数应用场景不再是一个问题。对大型工程来说,人们更看重的是架构层面的问题。把同一段内存,也就是一个object,用不同的reference来表达,这种方式本质上是会造成架构问题的。要求一个程序员在修改一个内存变量的时候,心中时刻记得所有指向同一内存地址的变量,需要时刻记得相关的所有变量,这样的要求会引发更多犯错误的可能。Swift之所以把可变性作为一个重点问题来抓,原因就是在现实中,可变性引发的bug实在太多太多了。因此Swift会强制你在传递或者复制一个对象的时候,除非特别制定,否则默认会真的复制一段内存内容出来,这样可以保证不变的对象是真的不变。

@superarts
superarts / 鬼泣5-DMD.md
Last active Aug 14, 2019
Devil May Cry 5 DMD
View 鬼泣5-DMD.md

鬼泣5正在慢慢打DMD难度,争取一命过关而且评价B以上。尼禄最简单,空中采花手抓怪空连空投,加上三级蓄力枪,大部分场景都没有风险。重型敌人蓄力枪打出硬直后用投技打出伤害即可,最难的是需要弹反的顺移哥和巨兽。但丁摩托空中风格风格打击风格循环可以无限锁死能挑空的敌人,但是起手比较慢;狗棍弹反瞬移哥难度比较低,但是总体来说控场难度比较大,比如有四五个转转在地上,尼禄在空中一个一个抓过来就好,但丁一不小心就会中招,好在可以开罪魔人解决不少麻烦的场景。V在DMD难度下手累很多,打法也很单一,基本上就是保持中距离挑衅,魔力留着复活使魔。

@superarts
superarts / swift-compare-inherited-type
Last active May 30, 2019
Getting and Comparing Type of Class
View swift-compare-inherited-type
class BaseClass: NSObject {
func test() {
let aType = type(of: self)
if aType == dict["My Base"] {
print("this is base")
} else if aType == dict["My Inherited"] {
print("this is inherited")
}
print(aType)
}
@superarts
superarts / pure-func-in-enum
Created May 7, 2019
Pure Functions in Swift Enum
View pure-func-in-enum
protocol PureEnumProtocol {
func test()
}
enum PureEnum: PureEnumProtocol {
static var v = 1 // Still possible
//var v = 1 // Enums must not contain stored properties
func test() {
//v = 2 // Impossible
@superarts
superarts / struct-in-static-func
Created May 7, 2019
`static func` in `struct` is not pure
View struct-in-static-func
struct TestStruct {
static var staticVar = 1
static func staticFunc() {
staticVar = 2
}
}
@superarts
superarts / test-target.swift
Last active Mar 4, 2019
Provide test only feature in Test target
View test-target.swift
protocol ProductionFeatureProtocol: TestFeature1, TestFeature2 {
}
struct DefaultProductionFeature: ProductionFeatureProtocol {
}
protocol TestFeature1 {
func testOnly1()
@superarts
superarts / extension-computed-property.swift
Created Mar 4, 2019
Extension Computed Property Behavior
View extension-computed-property.swift
// To maintain state of extension computed property, use static variable
// A console logger
protocol ConsoleLoggable {
var logger: ConsoleLoggerProtocol { get }
}
extension ConsoleLoggable {
var logger: ConsoleLoggerProtocol {
@superarts
superarts / ambiguous-logger.swift
Created Mar 1, 2019
Ambiguous loggers; use clogger and flogger instead
View ambiguous-logger.swift
/// TODO: is something like Loggable.Console / Loggable.File possible in Swift - single namespace inside a target?
// A console logger
protocol ConsoleLoggable {
var clogger: ConsoleLoggerProtocol { get }
}
extension ConsoleLoggable {
var clogger: ConsoleLoggerProtocol {
@superarts
superarts / Swift Mail Composer
Created Jun 29, 2015
Simple Mail Composer in Swift
View Swift Mail Composer
@IBAction func action_report() {
let composer = SVMailComposer()
composer.present(self, subject:SV.s.report_user_title, body:SV.s.report_user_body)
}
class SVMailComposer: MFMailComposeViewController, MFMailComposeViewControllerDelegate {
func present(controller: UIViewController, subject: String, body: String) {
if MFMailComposeViewController.canSendMail() {
mailComposeDelegate = self
setToRecipients(["leo@superarts.org"])