Swift 学习笔记(基本语法)

因为是本人学习 Swift 的笔记,是基于所掌握的其他语言来认识 Swift 的,所以并非详尽的 Swift ABC,也就显得凌乱不堪。
 
不会自动转型,强型转型的方式是 String(变量值), 括号不是括住类型

let 为常量, var 为变量, 类型的指定方式与  Scala 一样,如果不让它自动推断或无法推断时,这样指定类型


阅读全文 >>

Swift 语言 Server 端开发资料收集

苹果的 Swift 语言第二版预计在今年底开源,届时还可在 Linux 下使用 Swift 语言。试想一下此语言用在服务端 Web 开发也该是个很好的方向,需要实现对  HTTP 协议的支持。

Swift 本身就可以做 Shell 脚本用,所以以 CGI 的方式运行是没问题的,没有第三方相关的框架,可以自己完全输出响应头和体。

我们可以把 Swift 集成到像 Apache 或 Nginx 的 Web 服务器中,要做的工作可能多些,应该要用到 C/C++ 来写 Swift 支持模块。想下我们用这种 URL http://localhost/service/customer.swift 来访问 swift 实现的后台页面。

或者也可以让 Swift 代码像 NodeJs 一样运行,自己启动 HTTP Server。幸运的是我们已经有了 SwifterTaylor,再配之以纯 Swift 的模板实现 GRMustache, 简单开发不在话下。

一旦该语言流行开了,特别是能用在 Linux 平台下,总会有人去实现出对 HTTP 协议的支持,再配之以模板,让 Swift 像 PHP 一样在 Apache 中运行就不难了。 阅读全文 >>

Using Network Link Conditioner in iOS 6

来到芝加哥后好久没写博客了,有些文章本想翻译后介绍给大家,可如今越发没先前那翻译的意愿了,所以不妨直接贴出原文如下:

I previously covered using Network Link Conditioner to test how your app does in less-than-ideal network scenarios. One of the inconveniences of using it is in order to test your app on a device, you have to take the extra steps to configure a proxy on your computer that your device can connect to over a wi-fi connection. Well, not anymore. With iOS 6, Apple has given us Network Link Conditioner right on the device.

To get started with Network Link Conditioner, first your device must be set up as a developer device. If you haven’t done this yet, you’ll need to go to Xcode, open Organizer (Shift-Command-2), select your device, and click the button that says Use for Development to add the device your developer account. Once you’ve done that, you should be able to open Settings on your device and see a Developer menu near the bottom, just above the apps list. Tapping on that reveals some helpful settings, Network Link Conditioner Status obviously being the one relevant to our interests here. 阅读全文 >>

Objective-C 类方法 load 和 initialize 的区别

过去两个星期里,为了完成一个工作,接触到了NSObject中非常特别的两个类方法(Class Method)。它们的特别之处,在于iOS会在运行期提前并且自动调用这两个方法,而且很多对于类方法的规则(比如继承,类别(Category))都有不同的处理。

而因为这两个方法是在程序运行一开始就被调用的方法,我们可以利用他们在类被使用前,做一些预处理工作。比如我碰到的就是让类自动将自身类名保存到一个NSDictionary中。

先来看看NSObject Class Reference里对这两个方法说明:

+(void)initialize

The runtime sends initialize to each class in a program exactly one time just before the class, or any class that inherits from it, is sent its first message from within the program. (Thus the method may never be invoked if the class is not used.) The runtime sends the initialize message to classes in a thread-safe manner. Superclasses receive this message before their subclasses.

+(void)load

The load message is sent to classes and categories that are both dynamically loaded and statically linked, but only if the newly loaded class or category implements a method that can respond.
The order of initialization is as follows: 阅读全文 >>

Xcode 4 中使用自定义字体,非 Outlet 方式

在 Xcode 3 的时代,如果要使用自定义字体,只要把字体安装到系统中,就能够在 Interface Builder  中字体列表中选择到,当然需要把字体文件加到项目中,并且在 Xxx-Info.plist 文件中列举出来。

而到了 Xcode 4 后,要用个自定义的字体反而更难了,字体安装到了系统中,它也不会出现在 Interface Builder 中的字体列表,必须用 setFont 为需要的控件应用自定义字体,这是一个浩大的工程,要么遍历控件,要么就得为控件与 IBOutletCollection 关联起来。

难道是 Apple 不希望看到应用中各色字体令人眼花缭乱的景象,所以制造点障碍。也不知道新的  Interface Builder 中的字体列表由哪得来的,是否能把自己的字体出现在该列表中呢?这个嘛,有点难。

既然不想使用 setFont 方法对 Xib 中的众多的控件一一设置字体,那就得另寻 Hack 方法了,幸好有了 FontReplacer 的方法。FontReplacer 是为 UIFont 做的一个 Category,它的实现原理是利用 method_exchangeImplementations 机制把 UIFont 的 fontWithName:size:fontWithName:size:traits: 换成自定义的方法,然后在自定义的方法中按照预设置的字体映射,当遇到某个系统字体 A 时,换成自定义的字体  Custom-A。

而你所要做的就是在 Interface Builder 中寻找字体,自己记住当选用了 系统字体 A,运行时会是 Custom-A 字体,系统字体 B 运行时会是 Custom-B,根据需要自己映射就行。一般方便起见,我们会选择一种字体(Family),然后用它的 Style 来与我们的自定义字体对应。这样只需要 Interface Builder 里像往常一样设置字体就行了,从而达到一劳永逸。 阅读全文 >>

Objective-C 实现自己的 Subscripting Methods 下标方法

在前一篇 Xcode 4.4/4.5 新特性 / LLVM 4.0 新语法 提到了 Xcode 4.4 之后对数组和字典的操作可以用下面的方式:

id value = array[i];
array[i] = newObj;
id value = dictionary[@"key"];
dictionary[@"key"] = newObj;

上面几行语句实际调用的方法分别对应如下:

NSArray : - (id)objectAtIndexedSubscript: (NSUInteger)index;
NSMutableArray : - (void)setObject: (id)obj atIndexedSubscript: (NSUInteger)index;
NSDictionary : - (id)objectForKeyedSubscript: (id <NSCopying>)key;
NSMutableDictionary : - (void)setObject: (id)anObject forKeyedSubscript: (id <NSCopying>)aKey;

所以,如果你希望自己定义的类可以支持 obj[i] 和 obj[@"key"] 的方式来读取和设置值的话,就可以实现上面相应的方法,只是要处理好你自己参数和结果类型。现在就来看看下面自定义类 TestClass 的实现和执行效果: 阅读全文 >>

Xcode 4.4/4.5 新特性 / LLVM 4.0 新语法

跟着苹果干的好处就是,有什么新特性就尽快的就享用它们,这非常符常程序员们的学习心态。不像国内的某些技术领导,他们很领会某种舞台上的精髓 -- 稳定压倒一切 ,JDK 1.6 都出来了,还不少项目还牢牢固守在 JDK 1.3 上,程序员真是无言而又苦 B 啊。当然你在使用  Objective-C 时能时刻得到更新也得利于 Obj-C 完全由 Apple 主导,免了不少口水,瞧瞧 C++ 到 C++11,历时 13 年啊。

OK,言归正传,Xcode 当前版本 4.5.2,来看下自 4.4 以来它给我们带来了什么语言上的新特性。每个版本有新特性时一定要看官方的  What's New in Xcode。这么说来 Xcode 4.4 也算是个关键性的版本更新。

@ 不光可用于创建 NSString,还简单化了 NSNumber,NSArray 和  NSDictionary 对象的创建,一一来看。

@ 创建 NSNumber 实例

从 Xcode 4.4 起,无段  [NSNumber numberWithInt: 10] 这么写了,@10 就完事,下面是各种数值类型的 NSNumber 创建方式: 阅读全文 >>

VMware 9 安装 Mac OS X 10.8 Mountain Lion 图文全程

本教程是在 VMware 9 下安装当前最新版的 Mac OS X Mountain Lion 苹果系统。曾在 VirtualBox/VMware 下安装过 Mac OS Lion 系统,但安装后是无法升级到 Mountain Lion 的,所以直接上最新版。以前虚拟机安装苹果系统总有点麻烦事要处理,比如 About This Mac 黑屏,分辨率修改复杂些,借助别的 ISO 文件来引导系统。下面是我在 VMware 9 中安装 Mac OS X Mountain Lion 的全过程,比以往的安装方法要简单。

首先,硬件上你要有一个支持虚拟化技术的 CPU,足够用的内存。我的软硬件环境是 i7 CPU + 8G RAM + Win7 64Bit 英文版。

安装所需软件:

1. VMware 9.0  -- 可在网络上下载并可找到注册码,VMware 8 破解后也没有 Mac OS X 10.8 的选项

2. VMware 安装 Mac OS 的补丁: unlock-all-v110  -- 它可让你在 VMware 中选择 Mac OS X 系统

3. Mac OS X Mountain Lion 下载: Mac OS X 10.8.torrent -- 下载来的文件是 InstallESD.dmg

4. 7-Zip 压缩解压缩工具,免费的,网络随处找得到,用 Winrar 都解不了 InstallESD.dmg 阅读全文 >>

Mac 下 You don't have permission to access /~{username}/ on this server

当你在 Mac OS X 下启用了 Web Sharing,其实就是 Apache2 服务, 到浏览器里访问 http://localhost/~{username} 时提示

Forbidden

You don't have permission to access /~{username}/ on this server.

{username} 代表当前系统用户名。

看到上面的问题,首先会想到的是目录下 /Users/{username}/Sites 下的文件权限问题,有可能,但我碰到的问题不是这样的。

而是需要在目录 /etc/apache2/users 创建一个文件 {username}.conf,如 Unmi.conf,甚至可以任意文件名,文件内容如下:

阅读全文 >>

Mac 下包抓取(sniffer) 工具介绍

由于近期常工作于 Mac 环境下,对有些应用稍加深入点研究就免不了要用到网络包抓取工具来分析。早先在 Windows 环境用过老牌的 Sniffer Pro 和 Netxray,以及后来都用免费开源的 Packetyzer 和  Wireshark。偶尔还用过 Windows 服务版自带的网络监视器。

那 Mac 下有什么好用的抓包工具呢,试用了一下下面几个工具:

一. tcpdump 命令

因为它是 Unix 族的,所以首先想到的是 tcpdump 工具,确实 Mac 下也有这个命令,但用起来也太难了,全在命令行下,看起来不直观。

tcpdump 命令的使用可参考以下两个链接:

1. Mac OS X: How to capture a packet trace
2. A tcpdump Tutorial and Primer

二. Ethereal

图形界面的,跨多平台,功能也不错,不过基本你可以忽略它了,它自 2006 年以来就没再发展了,永远死守在 0.99 版了。它就是大我鼎鼎的 Wireshark  的前生。

三. Wireshark

轮到 Wireshark 的隆重出场了,作为 Ethereal 更名后的产品,它仍然是开源的且多平台通吃的。你只要在 Windows 上用过它的话,在 Mac 下的操作方式都一样的。 阅读全文 >>