1.å¦ä½è¯ä»· Swift è¯è¨
2.[IOS黑魔法] - 语法糖(简单却不那么简单)
å¦ä½è¯ä»· Swift è¯è¨
ç¿»å®iBooks书åºä¸çThe源码 Swift Programming Language, ä¹ä¸è½½äºXcode 6çbetaçæ¬æ¥è¯éªäºä¸ä¸ãç°å¨å¯ä»¥è¯ä»·ä¸ä¸ãå¦åç°ä¸å¯¹çå°æ¹ï¼è¯·å¨è¯è®ºä¸æåºï¼ææé åè¿è¡ä¿®æ£ã
主è¦ä»ææ¯çè§åº¦ãèåä¸çè§åº¦ï¼å¸å¼å¼åè ï¼å ±åç»´æ¤è¹æçæåçç¹è£çä¹ç±»å°±ä¸è¯´äºã
æä¸æ¢è¯´swiftå¦äºæ没æç¨ï¼å¯ä¸å¯ä»¥æ£æ´å¤é±ï¼ä½è¿é¨è¯è¨è¿æ¯æ¯è¾æææçãswift骨åéé¢è¿æ¯objcï¼ä½ææ®è¿ï¼æ¯åæ¥çæ¨¡æ ·æ¼äº®ã个人æè§ï¼è¹æè¿ççæ³ç¨å®å代objcå¢ã
------------------
swift è· objc å ±ç¨åä¸å¥çè¿è¡æ¶ç¯å¢
swift çç±»åï¼å¯ä»¥æ¡¥æ¥å° objc çç±»åï¼åä¹äº¦ç¶ãå¦ string 对åºåæ¥objcçNSString, closures对åºobjcçblockï¼ççãobjc 积累ä¸æ¥ç大éåºï¼å®ç°ä¸ç¨æ¹åï¼swift å°±ç´æ¥å¯ä»¥ä½¿ç¨ãï¼æå¤å 个声ææ件ï¼ãç两个APIç声æï¼å¯¹æ¯ä¸ä¸
objc
void
dispatch_apply(size_t iterations, dispatch_queue_t queue,
void (^block)(size_t));
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
swift
func dispatch_apply(iterations: UInt, queue: dispatch_queue_t!, block: ((UInt) -> Void)!)
func touchesBegan(touches: NSSet!, withEvent event: UIEvent!)
ææçï¼swiftä¸çæ¥å£æ件ï¼æ¯å©ç¨åæ¥objcï¼cä¸çæ¥å£æ件èªå¨ç¨åºçæçã
åä¸ä¸ªå·¥ç¨ï¼å¯ä»¥åæ¶ä½¿ç¨swift, objc, c, c++ åç§ç¼è¯è¯è¨ï¼é¢å¤åµå ¥çèæ¬è¯è¨å¦ç®ï¼
åæ¥ç iOS/Mac å·¥ç¨ï¼å·²ç»å¯ä»¥åæ¶ä½¿ç¨objc, c, C++ä¸ç§è¯è¨ãç°å¨æ¯æ第åç§ãobjc, c, c++ä¸ç§è¯è¨çç»åå¾å®¹æï¼ objcè·cæ¬èº«å°±å ¼å®¹ï¼objcè·c++ç»ååªè¦å°æ件åæ¹æ.mmãèswiftè·å ¶å®è¯è¨çç»åï¼éè¦å¦å¤çæ件è¿è¡æ¡¥æ¥ï¼å ¶å®ä¹æºæ¹ä¾¿çã
è¿éçæ¡¥æ¥å¾å®¹æï¼Appleèªå®¶çåç§ C åºç§»æ¤è¿æ¥äºãæ¯å¦Core Image/Audioï¼ç´æ¥å å«
import CoreAudio
import CoreImage
å°±å¯ä»¥ä½¿ç¨äºã
ç°å¨swiftå®å ¨å¯ä»¥è·objc并åï¼åæ¥çå·¥ç¨ä¸å»ºè®®éåï¼ä¹ä¸ç¨éåãé¡ºå ¶èªç¶ï¼æ ¢æ ¢è®©å®è¿åå°±æ¯äºã
swift åæ³çèµ·æ¥åèæ¬è¯è¨ï¼ä½å®æ¯çæ£çç¼è¯è¯è¨
åå¦è ï¼çå®ä½¿ç¨äº
let a = 4
var b = "hello"
没æç±»åå®ä¹ï¼å°±æ³å½ç¶çè§å¾å®æ¯èæ¬è¯è¨ï¼è§£éæ§è¡ï¼è¿æ¯é误çãä¸é¢ä¸¤è¡è¯å¥æ¯ç¨äºç±»åæ¨å¯¼ï¼ç±»ä¼¼ C++ éé¢çautoãswiftè·objcçè¿è¡æ¶ç¯å¢ä¸æ ·ï¼åçç¨åºè·èµ·æ¥ä¸ä¼æ¯objcæ ¢ãswiftåºåäºstructåclass, åå«ä½¿ç¨ä¼ å¼è·ä¼ å¼ç¨ãéå½å°ä½¿ç¨structï¼åºè¯¥ä¼æ¯objcè¦å¿«ä¸ç¹ã
swift å¸æ¶äºå¾å¤å ¶å®è¯è¨çè¯æ³ï¼åèµ·æ¥æ¯objcç®æ´å¾å¤ï¼ä¸è¿å®éª¨åéé¢çæ¦å¿µï¼è·åæ¥objcå·®ä¸å¤
ç¼ç¨è¯è¨çè¯æ³éè¦ï¼ä½æ¯è¯æ³èåçæ¦å¿µæ´éè¦ãæ¯å¦é¢å对象ï¼å¸¸ç¨æ¦å¿µæ éæ¯ï¼ç»§æ¿ï¼å¤æï¼å°è£ ï¼ä¿¡æ¯éèçã继æ¿åå¯è½åæå¤é继æ¿ï¼æ¥å£ç»§æ¿ï¼å®ç°ç»§æ¿ãæè è¿ä¼æäºåµå¥ç±»ï¼åµå¥å½æ°ççã
å½æç½è¯æ³èåçæ¦å¿µï¼ç¥é为ä»ä¹éè¦æè¿äºä¸è¥¿ãä¹åä»ä¸é¨è¯è¨åæ¢å°å¦ä¸é¨æçç¸åæ¦å¿µçè¯è¨ï¼å ¶å®å¾å®¹æã
èè¯æ³ä¼å½±å表达ï¼ç论ä¸æ¯é¨è¯è¨é½å¯ä»¥è¡¨è¾¾ä»»ä½æ¦å¿µãä¸è¿å½æç§æ¦å¿µå¨æé¨è¯è¨ä¸ï¼å¾é¾è¡¨è¾¾åºæ¥ï¼å°±ä¼å¾åäºä¸è¿æ ·ä½¿ç¨å®ï¼è¿ç§æ¦å¿µå¨é£é¨è¯è¨ç社åºå°±é¾ä»¥è¢«äººçç¥ã
æè§ä¸ï¼swiftæç obj-c, C++, Rubyçå½±åã
ææ¶ï¼æèªå·±æå欢ç3个ç¹æ§æ
tupleï¼ç»äºå¯ä»¥è¿åå¤ä¸ªæ°å¼äºãä¸è¡äº¤æ¢ä¸¤ä¸ªå¼ãC++éé¢çtie+tupleä¹å¯ä»¥å®ç°ç±»ä¼¼åè½ï¼ä¸è¿ä½¿ç¨åºï¼æ¾å¾åªé³å¤ªå¤ã
closureï¼å欢å®çç®åï¼è¿æå¨å½æ°æåä¸åæ°ï¼å¯ä»¥åå¨()å¤é¢ãè¿äºç¹æ§ï¼ç¨æ¥åå½æ°å¼é£æ ¼çç¨åºï¼ä¼å¾å¥½çãèåæ¥objcçblock, è¿æc++çfunction, 就太å°å¦äºã
switchï¼caseéé¢çæ¡ä»¶å¹é ã
è¿äºè¯æ³ï¼ç¼è¯æåè¿æ¯ä¼æ å°æåæ¥objcçè¿è¡æ¨¡åãåæ¥objcçæ¦å¿µï¼å¼ç¨è®°æ°ï¼ARC, å±æ§ï¼åè®®ï¼æ¥å£ï¼åå§åï¼æ©å±ç±»ï¼å¿åå½æ°ççï¼ç»§ç»ææã
æå°swiftçææ¯objcçä¸å大大çè¯æ³ç³ã
æ个大å头çä¸è¥¿ï¼æ¯åæ¥objc没æçï¼å°±æ¯æ³åãswiftä¸ å°é£ç§æä½åä¸æ¬¡ï¼å°±å¯ä»¥ä½ç¨å¤ä¸ªç±»åçè¯æ³å«ågenericsï¼æ³åï¼ï¼èC++ä¸ç§°ä¸ºtemplateï¼æ¨¡æ¿ï¼ï¼å«æ³ä¸åï¼æ¬è´¨æ¯åæ ·çä¸è¥¿ã
æ»ç说æ¥ï¼swfit 涵çäºç°å¨æµè¡çç¼ç¨æ¹å¼ï¼ç»æåï¼é¢å对象ï¼æ³åï¼å½æ°å¼ã
swiftçæ°è¯æ³ï¼å¯ä»¥å¾å¥½å°æ¯æå é¨DSL
æä¸ç§ç¼ç¨é£æ ¼ï¼ä¸å¤ªå¥½å½ç±»ãå°±æ¯å°ç¨åºæåæï¼æè¿°+解éã解éé¨ååä¸æ¬¡ï¼å ¶å®å°æ¹ä½¿ç¨æè¿°å¼çè¯å¥ï¼èä¸æ¯å½ä»¤å¼çè¯å¥ã
å é¨DSLï¼é常å©ç¨ä¸»è¯è¨çè¯æ³ç¹æ§ï¼ååºä¸å¥åæ³ï¼æ¥åä¸äºæè¿°æ§çè¯å¥ãè¿äºè¯å¥ç»åèµ·æ¥ï¼å°±åä¸é¨æ°è¯è¨ä¼¼å¾ãè¿ä¸ªæ¯è¾é¾ç解ã举个ä¾åï¼ä»rubyé£éåè¿æ¥çï¼ï¼åå¦è®¡ç®ï¼å å°æ¶ä¹åçç§æ°ãCè¯è¨ä¸ï¼å¤§æ¦ä¼åæ
getHourSeconds(3)
èç°å¨ swiftä¸ï¼åªè¦å®ä¹äºæ©å±
extension Int
{
var hours:Int
{
return self *
}
var ago:Int
{
return -self
}
}
å°±å¯ä»¥åæ
3.hours
3.hours.ago
åå«æ¯3å°æ¶åçç§æ°ï¼3å°æ¶åçç§æ°ã
åçï¼ä¹å¯ä»¥åæ
.days
.days.ago
è¿ç§åæ³ï¼çèµ·æ¥è·åæ¥çå½ä»¤å¼åæ³å®å ¨ä¸åãè¿äºç¨åºæ¯æè¿°æ§çãåæ¥çobjc, åä¸å°è¿ç¹ã æ估计swift以åä¼ååºå¤§éè¿æ ·é£æ ¼çåºã
è¿ç§é£æ ¼ï¼å°åºå¥½ä¸å¥½ï¼è¦çæ åµãæ¯è¾æ¹ä¾¿å®ä¹å é¨DSLçè¯è¨, æèªå·±ç¥éçæC++, Ruby, Lispãç°å¨å¤äºSwiftã
认为ææ人é½æ¯0åºç¡çï¼æ¯é误ç
æäºäººå¦å¾ç¹å«å¿«ï¼å 为ä¹åçåºç¡å¥½ãè¯è¨çè¯æ³åªæ¯è¡¨é¢ï¼è¡¨é¢çä¸è¥¿æ»æ¯åå¨å¾æ¯è¾å¿«çãåºä¸çä¸è¥¿éè¦å¾å¤ï¼èçä¸è§ãæ°´é¢ä¸åå°ï¼æäºäººæ¯å°å±±é²åºä¸è§ï¼æäºäººæ¯æ æ ¹çæµ®å°ãçèµ·æ¥å·®ä¸å¤ï¼å ¶å®å·®å«ååä¹å¤§ã
æç¸ä¿¡æäºäººï¼å¨ä¸¤ä¸ªå°æ¶ä¹å å°±å¯ä»¥ä½¿ç¨è¿é¨æ°è¯è¨ã
ææé£ä¸ªPlayground
ä¹åè¹æçåå·¥ï¼Bret Victor æ¼è®²è¿ä¸ªè§é¢ãæå°è¿ä¸ªè¿ç§å¯è§åç¼ç¨ãå½æ们æ¯ä¸æ¥æä½ï¼é½å¾å°å®æ¶å°åé¦ï¼æ们çåæ³ä¼æå¾å¤ä¸åï¼ååºçä¸è¥¿ä¹ä¼ä¸åãè¿ä¸ªPlaygroundï¼ç¨æ¥å¦ä¹ swiftçç¹æ§å¾å¥½ç¨ï¼ä¸è¿æè¿ä¸ç¥éæä¹æè½è·å·¥ç¨ç»åèµ·æ¥ä½¿ç¨ï¼ä¸ä½è¯è®ºã
ç°é¶æ®µï¼æèªå·±çåæ³
æèªå·±åçæ°é¡¹ç®ï¼å°ä¼æä¸é¨å使ç¨swiftæ¥ç¼åãä½è¿æ¯ä¼ä»¥objc为主ãåè§ç°å¨Xcode 6 betaçæ¬ï¼å¯¹swiftçè¯æ³æ示æ¯æä¸å¥½ï¼ä¸è½æå 个åæ¯å°±èªå¨å®æãåè§å¯ä¸éµåã
æä¸æ¢å±æ太å¤ï¼æè é¢æµä»ä¹ï¼é常æåé¢æµé½æ¯éçï¼ä¼è®©äººæä½ææãä½æè§Appleåå¸swift, ç»ä¸æ¯ç©ç©èå·²ã
[IOS黑魔法] - 语法糖(简单却不那么简单)
在进行程序开发时,我特别喜欢使用语法糖来简化代码,源码这样既能保持代码的源码简洁,又能提高可读性,源码减少出错的源码机会。下面,源码cocos源码购买我将分享一些在iOS开发中使用语法糖的源码实践经验和心得,希望能对大家有所帮助。源码如有更好的源码补充或有疑问,请随时与我分享,源码让我们一起成长。源码
### OC语法糖
在Objective-C中,源码一些语法糖可以让你的源码httrack 源码代码更加优雅。比如,源码对于数组和字典的源码初始化与访问,我们可以采用更简洁的方式。
#### 数组初始化与访问
在初始化数组时,我们常常会这样编写:
objc
NSArray *myArray = @[@"Apple", @"Banana", @"Cherry"];
通过语法糖,我们可以简化这一过程:
objc
NSArray *myArray = [NSArray arrayWithObjects:@"Apple",点灯源码 @"Banana", @"Cherry", nil];
这样不仅代码更简洁,也更容易阅读。
#### 字典简化
对于字典的初始化与访问,语法糖同样能带来便利。例如:
objc
NSDictionary *myDict = @{ @"key1": @"value1", @"key2": @"value2"};
通过语法糖,我们可以简化为:
objc
NSDictionary *myDict = @{ @"key1": @"value1", @"key2": @"value2"};
这样的写法虽然与上面的例子相同,但在实际应用中,业主源码它能帮助我们更快速地理解代码意图。
#### NSNumber简化
在处理数字时,通过语法糖可以更直观地进行转换与访问。例如:
objc
NSNumber *number = [NSNumber numberWithInt:];
通过语法糖,我们可以简化为:
objc
NSNumber *number = [NSNumber numberWithInt:@"c"];
这个例子说明了字符转换为数字时的ASCII码表示。在某些上下文中,源码 rpm这种简洁的表示方式更加直观。
### @()语法糖
在Objective-C中,`@`符号可以被理解为一个特殊的宏,它根据传入的C字符串类型(常量或字符串)在运行时构建返回不同类型的NSString。例如:
objc
NSString *str = @”Hello, world!”;
这实际上等价于:
objc
NSString *str = [NSString stringWithString:@"Hello, world!"];
使用宏`@()`可以避免在编写字符串时的繁琐,简化代码。
### UI语法糖
在UI开发中,语法糖也能显著提升代码的可读性。例如,在Swift中,我们可以使用语法糖简化UI元素的创建:
swift
let imageView = UIImageView()
imageView.image = UIImage(named: "image")
### Swift语法糖
Swift语言中,`if let`和`guard`语法糖简化了条件判断与异常处理,使得代码更加简洁。例如:
#### if let 与 guard语法糖
在Swift中处理optional类型时,`if let`和`guard`可以替代传统的if语句,使得代码更清晰。例如:
swift
if let value = optionalValue {
// 使用 value
}
对比传统的写法:
swift
if optionalValue != nil {
// 使用 optionalValue
}
`guard`语法糖则进一步简化了条件判断,避免了过多的嵌套,例如:
swift
guard let value = optionalValue else {
// 处理 optionalValue 为空的情况
return
}
// 使用 value
### 语法糖Selector例子
在处理UI事件,尤其是为多个按钮添加点击事件时,使用语法糖可以简化Selector的管理。例如:
#### 为按钮添加点击事件
通过语法糖,我们可以更方便地为视图控制器中的按钮添加点击事件,避免代码过于臃肿:
swift
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// 为按钮添加点击事件,使用语法糖简化代码
let button = UIButton()
button.addTarget(self, action: #selector(buttonClicked(_:)), for: .touchUpInside)
}
@objc func buttonClicked(_ sender: UIButton) {
// 处理点击事件
}
}
这样不仅代码整洁,还能更直观地管理不同按钮的点击事件。