近期在Mac和iOS上做开发,认为应该写一点东西分享给感兴趣的童鞋们。在此之前。以前有非常多同行们都在埋怨苹果Objective-C的复杂和难以上手,为此也有非常多人对今年(2014年)刚推出的Swift抱有非常多幻想。

首先在现阶段甚至五年以内,我个人感觉Mac和iOS的开发能够说仍然离不开Objective-C,即便是应用级(非系统级)的开发,招聘iOS程序猿肯定还是看有没有扎实的Objective-C的功底。尽管苹果希望Swift能够代替Objective-C,但这一定是一个长期目标。

在Swift的公布会上,库克说Swift会成为改变一切的语言。只两个月之后,在TIOBE公布的编程语言排行榜上。Java和C++再创历史新低(当然我最钟爱的C语言仍然占领头把交椅,尽管它的Rating也下降了0.25%),而Swift作为一个新生儿直接抢占了第18名的宝座(大约100个程序猿里面就有一个使用Swift的),人们对这个语言的期待能够说是异常的高。然而,我想说的是。Objective-C没有想象中的那么难。而Swift也不是轻松愉快就能玩转的,Swift同一时候接纳了两种编程理念或者叫范式(paradigm)。面向对象编程和函数式编程,而在此之前。关于面向对象编程和函数式编程到底孰优孰劣的争论非常长时间都没有停止过。事实上,真正理解两种编程范式的程序猿不会武断的说这二者孰优孰劣,由于不论什么编程语言都没有什么灵丹妙药让其使用者成为优秀的程序猿。又如牛人王垠说的。『不管不论什么事情,当走向极端时都是有害的。极端化时。面向对象编程和函数式编程都试图将整个世界装入其特有的模型中,可是这个世界是不依赖于我们的大脑的思考的情况下运转的。

假设以为你有一个锤子。就把全部东西都当成钉子,这显然是不正确的。唯独通过认清我们的真实世界。才干摆脱信仰对我们的束缚。』『让你的模型适应世界,而不是让世界适应你的模型。』尽管我不喜欢王垠这个人,可是这段话我还是非常赞同的。林锐博士也说过,『一个优秀的程序猿不会宣称自己效忠于某种语言』。他们总是选择最合适的工具做自己想做的事。

事实上,即便你是一个Java程序猿,假设你使用过訪问者模式、命令模式。假设你使用过接口回调,你实际上已经使用了函数式编程的理念。相同,你也能够用C语言写出面向对象风格的代码。

Swift能够说是比JavaScript还大杂烩的大杂烩。从它身上你似乎不怎么能看到Objective-C的影子,可是却有JavaScript、C#、Java和其它一些我不了解的动态语言/函数式语言(如Ruby、Python、Haskell)的身影,仅仅是这一点就注定了它『绝不简单』。事实上苹果早在2010年就任命Chris Lattern为iOS开发下一代编程语言。经过4年的时间才打造出了Swift。简单的说,Swift是支持面向对象和函数式两种编程范式的语言,它在动态语言和静态语言之间寻找平衡点。既有静态语言的特征,也详细动态语言的神韵。同一时候它也是类型安全语言,又支持非常多高级语言特性。包含闭包、泛型等。Swift能给非常方便的和C/C++/Objective-C进行混合编程,使用Unicode字符集。和Swift一起推出的是Xcode中的Playground,这个东西尽管让某些程序猿认为惊艳,可是事实上IBM早在十年前就有类似的东西,仅仅只是没有Playground那么炫罢了。近期看了苹果iPhone6的公布会。突然认为对苹果的未来持悲观态度了,没有了乔帮主,苹果还能牛多久呢,谁也不知道。

反正,作为一个程序猿或者开发人员,无论你选择使用Objective-C还是Swift,都会有非常长的路要走,要经过各种修炼。事实上Objective-C那种声明和实现分离的做法不就是在践行面向对象原则中的接口和实现分离。面向接口编程的理念吗。所以在我心中那是非常优雅的。

Swift中的protocol(协议)不也是如此吗,仅仅只是protocol这个词easy让人误解,可能就叫接口(interface)或者契约会更好吧。

以下给出一些链接帮助有兴趣的童鞋们阅读相关资料,同一时候附上一段用Objective-C写的代码。做的是一个计算机自己跟自己玩猜数字的小游戏。

面向对象编程语言中的函数式编程:http://blog.csdn.net/shendl/article/details/2064218

王垠:面向对象和函数式编程的问题出在哪里?http://geek.csdn.net/news/detail/3603

TIOBE 2014年9月编程语言排行榜:http://www.csdn.net/article/2014-09-09/2821587-tiobe-programming

下图展示了Xcode 6的新功能Playground:

用Objective-C写的猜数字游戏(计算机自己出一个1-100的随机数。然后自己来猜答案)

#import <Foundation/Foundation.h>

@interface Game : NSObject {
@private
int correctAnswer;
NSString *hint;
}
- (Game *) init;
- (int) judge:(int)thyAnswer;
- (NSString *) getHint; @end @implementation Game - (Game *) init {
self = [super init];
correctAnswer = arc4random() % 100;
return self;
} - (int) judge:(int)thyAnswer {
if(thyAnswer == correctAnswer) {
hint = @"恭喜你,答对了。";
}
else {
if(thyAnswer < correctAnswer) {
hint = @"大一点";
return 1;
}
else {
hint = @"小一点";
return -1;
}
}
return 0;
} - (NSString *) getHint {
return hint;
} @end int main() {
Game *g = [Game new];
int lower = 0, upper = 100;
int result = 0;
do {
int myAnswer = (lower + upper) / 2;
NSLog(@"I guess the answer is: %d", myAnswer);
result = [g judge:myAnswer];
NSLog(@"%@", [g getHint]);
switch(result) {
case -1:
upper = myAnswer; break;
case 1:
lower = myAnswer; break;
}
} while(result != 0);
NSLog(@"游戏结束!");
[g release];
return 0;
}

因为Mac系统是基于Unix的操作系统。因此打开终端程序能够通过键入命令的方式来编译和执行上面的代码,命令例如以下:

cc -framework Foundation 文件名称.m (cc就是c-compiler,Unix系统的C编译器,也可以编译Objective-C并生成目标代码)

当然。上面的代码并不应当放在同一个文件里,@interface部分放在头文件(后缀名为.h的文件)中,而@implementation部分放在源文件(后缀名为.m的文件)中。一个定义接口。一个定义实现,做到接口跟实现分离,将来能够通过置换调实现文件来提供新的或者不同的功能。为此,你应该直接使用Xcode来建一个项目,例如以下图所看到的:

iOS开发系列课程预告的更多相关文章

  1. iOS开发系列--Swift语言

    概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...

  2. iOS开发系列文章(持续更新……)

    iOS开发系列的文章,内容循序渐进,包含C语言.ObjC.iOS开发以及日后要写的游戏开发和Swift编程几部分内容.文章会持续更新,希望大家多多关注,如果文章对你有帮助请点赞支持,多谢! 为了方便大 ...

  3. iOS开发系列--App扩展开发

    概述 从iOS 8 开始Apple引入了扩展(Extension)用于增强系统应用服务和应用之间的交互.它的出现让自定义键盘.系统分享集成等这些依靠系统服务的开发变成了可能.WWDC 2016上众多更 ...

  4. iOS开发系列--Swift进阶

    概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用S ...

  5. iOS开发系列--通知与消息机制

    概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地 ...

  6. iOS开发系列--数据存取

    概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储, ...

  7. iOS开发系列--网络开发

    概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力 ...

  8. iOS开发系列--C语言之基础知识

    概览 当前移动开发的趋势已经势不可挡,这个系列希望浅谈一下个人对IOS开发的一些见解,这个IOS系列计划从几个角度去说IOS开发: C语言 OC基础 IOS开发(iphone/ipad) Swift ...

  9. iOS开发系列--让你的应用“动”起来

    --iOS核心动画 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建 ...

随机推荐

  1. Codeforces Round #502 (in memory of Leopoldo Taravilse, Div. 1 + Div. 2) G. The Tree

    G. The Tree time limit per test 3 seconds memory limit per test 256 megabytes input standard input o ...

  2. iptables配置允许mysql远程访问

    vi /etc/sysconfig/iptables iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCE ...

  3. Easy File Sharing Web Server 6.9远程溢出漏洞

    from struct import pack import socket,sys import os host="192.168.109.129" port=80 junk0 = ...

  4. hdu 5317 RGCDQ (2015多校第三场第2题)素数打表+前缀和相减求后缀(DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5317 题意:F(x) 表示x的不同质因子的个数结果是求L,R区间中最大的gcd( F(i) , F(j ...

  5. 解耦你的HTML,CSS和JAVASRIPT

    注:本文为翻译文章,原文<Decoupling Your HTML, CSS, and JavaScript> 今天在web上任何大一点的网站或应用程序都包含大量的html,css和jav ...

  6. wikioi 1017 乘积最大

    dp[i][j]=max(dp[i][j],dp[t][k-1]*mapn[t+1][i]); dp[i][j]代表从0-i之间有j个乘号,mapn[i][j]表示第i位到第j位的数究竟是多少 #in ...

  7. SGU 403 Game with points

    408. Game with points Time limit per test: 0.25 second(s)Memory limit: 65536 kilobytes input: standa ...

  8. 客户端程序获取自己的ip、isp、地理位置等信息

    @ 比如说你需要收集用户信息,又或者要通过这些信息让用户登陆合适的服务器(北京联通用户登陆北京联通服务器). @ 淘宝和新浪都提供了类似的API,你只需要发送一个http请求,它就返回一个json格式 ...

  9. winform打开进程与关闭进程

    #region 判断某进程名是否运行 /// <summary> /// 关闭指定名称的进程 /// </summary> /// <param name="p ...

  10. java基础学习总结——Object类

    一.Object类介绍