咱们知道, 在 Cocoa 中提供了两种字符串类: NSString 和 NSMutableString, 前者用于处理内容不变, 固定的字符串, 好比窗口标题; 后者用于处理内容可变的字符串, 固然后者也能够用于前者的使用场合.ui
由于后者 NSMutableString 类是在继承 NSString 类的继承上建立的, 因此 NSMutableString 具备NSString 中全部的功能.code
在 Objective-C 代码中一般会使用以下的格式来定义字符串:对象
NSString string = @"This is my string";
语法很是简单明了, 可是有一个问题:使用加 @ 符号的方式只能定义英文数字字符串, 若是想定义中文等多字节字符串, 这种方法是不支持的.继承
下面给出一种 Objective-C 中定义中文字符串的示例:字符串
NSString* string; string = [NSString stringWithCString:"你好,我是中文字符串!" encoding:NSUTF8StringEncoding];
是否是以为这段代码特别繁琐, 若是转化为 Common Lisp 代码, 也比较麻烦, 不过 Clozure CL 已经提供了一种很是简单的生成中文字符串的方法, 以下:get
(ccl::%make-nsstring "这是使用中文字符串的简单方法")
举个实际的例子, 先绘制一个小窗口, 窗口标题为英文:string
(in-package "CL-USER") (require "COCOA") (defclass window-view (ns:ns-view) () (:metaclass ns:+ns-object)) (objc:defmethod (#/drawRect: :void) ((self window-view) (rect :<NSR>ect)) (#/set (#/blueColor ns:ns-color)) (#_NSRectFill (#/bounds self))) (defun show-window () (ccl::with-autorelease-pool (let* ((rect (ns:make-ns-rect 0 0 350 350)) (w (make-instance 'ns:ns-window :with-content-rect rect :style-mask (logior #$NSTitledWindowMask #$NSClosableWindowMask #$NSMiniaturizableWindowMask) :backing #$NSBackingStoreBuffered :defer t))) (#/setTitle: w #@"This is a English Title!") (#/setContentView: w (#/autorelease (make-instance 'window-view))) (#/center w) (#/orderFront: w nil) (#/contentView w)))) (show-window)
截图以下:it
接着咱们修改一下这句:io
(#/setTitle: w #@"This is a English Title!")
把它改成:table
(#/setTitle: w (ccl::%make-nsstring "这是使用中文字符串的简单方法"))
固然了, 咱们能够直接运行上述两段生成英文字符串和中文字符串的代码, 比较一下它们返回的结果,以下:
? #@"This is a English Title!" #<NS-CONSTANT-STRING "This is a English Title!" (#x65BBD0)> ? (ccl::%make-nsstring "这是使用中文字符串的简单方法") #<NS-MUTABLE-STRING "这是使用中文字符串的简单方法" (#x662600)> ?
很显然, 它们返回的对象类型不一样, 一个是 NS-CONSTANT-STRING , 一个是 NS-MUTABLE-STRING.
所有代码形如:
(in-package "CL-USER") (require "COCOA") (defclass window-view (ns:ns-view) () (:metaclass ns:+ns-object)) (objc:defmethod (#/drawRect: :void) ((self window-view) (rect :<NSR>ect)) (#/set (#/blueColor ns:ns-color)) (#_NSRectFill (#/bounds self))) (defun show-window () (ccl::with-autorelease-pool (let* ((rect (ns:make-ns-rect 0 0 350 350)) (w (make-instance 'ns:ns-window :with-content-rect rect :style-mask (logior #$NSTitledWindowMask #$NSClosableWindowMask #$NSMiniaturizableWindowMask) :backing #$NSBackingStoreBuffered :defer t))) (#/setTitle: w (ccl::%make-nsstring "这是使用中文字符串的简单方法")) (#/setContentView: w (#/autorelease (make-instance 'window-view))) (#/center w) (#/orderFront: w nil) (#/contentView w)))) (show-window)
而后再次运行, 截图以下:
是否是很简单. :)
以上的示例代码能够做为一个简单的用 Lisp 写苹果 APP 程序的窗口模板, 你能够慢慢本身添加一些其余的功能, 很快就能获得一个不太大可是可以提供一些简单功能的 APP 程序了!