FreeOZ论坛

标题: 苹果推新编程语言Swift 替代Objective C [打印本页]

作者: Jay@Au    时间: 3-6-2014 14:02
标题: 苹果推新编程语言Swift 替代Objective C
本帖最后由 Jay@AU 于 3-6-2014 13:27 编辑

Apple designed Swift to be as intuitive and easy to use as popular interpreted languages such as Python and JavaScript, while maintaining the speed and flexibility of compiled languages such as C++

苹果的东西好用,但是开发起来不方便,显得笨拙。  新语言出来可能将改变这一现状。 粗略了解了一下,看上去顺眼多了
作者: TimeSpace    时间: 3-6-2014 14:05
嗯,Apple早该跟上这一节奏了。
作者: 妞爸    时间: 3-6-2014 14:48
哇,这会不会催生出新的领域和工作机会
作者: trisun    时间: 3-6-2014 14:49
Objective C is really ugly..
作者: woodheadz    时间: 3-6-2014 14:56
比objectC好看多了... 但还是很丑
作者: michaelsusu    时间: 3-6-2014 15:00
I would love it.
作者: kevinwei2005    时间: 3-6-2014 15:00
OBJ-C确实 ugly
作者: trisun    时间: 3-6-2014 15:06
woodheadz 发表于 3-6-2014 11:56
比objectC好看多了... 但还是很丑

swift看起来还不错,好看多了,和Scala,Perl 比较像了。
作者: woodheadz    时间: 3-6-2014 15:17
trisun 发表于 3-6-2014 14:06
swift看起来还不错,好看多了,和Scala,Perl 比较像了。

比objectC好多了,但我还是不喜欢里面一些匪夷所思的地方。比如这个:
func simpleDescription() -> String {
        return "A shape with \(numberOfSides) sides."
    }

定义变量类型的时候用的是: let a:String = "test", 而定义函数类型的时候用奇葩的“->”! 我实在不明白这么设计的逻辑是什么。
作者: trisun    时间: 3-6-2014 15:26
本帖最后由 trisun 于 3-6-2014 12:30 编辑
woodheadz 发表于 3-6-2014 12:17
比objectC好多了,但我还是不喜欢里面一些匪夷所思的地方。比如这个:
func simpleDescription() -> St ...


->   lamda expression
作者: Jay@Au    时间: 3-6-2014 15:27
woodheadz 发表于 3-6-2014 14:17
比objectC好多了,但我还是不喜欢里面一些匪夷所思的地方。比如这个:
func simpleDescription() -> St ...

let 定义常量。 var 跟javascript 一样。

估计适应就好了。 比较objc,是从笨拙走向轻巧
作者: woodheadz    时间: 3-6-2014 15:33
trisun 发表于 3-6-2014 14:26
->   lamba expression


那是不一样的。
swift这个存粹是拿来指定函数返回值类型的,我觉得根据它的变量定义方式 “let a:String=...", 这个地方理所当然应该用 ":" 而不是奇葩的”->"。 "->"怎么看都无法和定义返回值类型关联起来。

而lambda expression里的"=>"可以视为匿名函数的快捷写法,算是个语法糖。写起来很自然。

swift设计者还是不能和anders这样的大师比。
作者: trisun    时间: 3-6-2014 15:41
woodheadz 发表于 3-6-2014 12:33
那是不一样的。
swift这个存粹是拿来指定函数返回值类型的,我觉得根据它的变量定义方式 “let a:Stri ...

习惯了就好, HasKell的语法开始看起来也比较怪:

addVectors :: (Num a) => (a, a) -> (a, a) -> (a, a)  
作者: xychar    时间: 3-6-2014 15:45
woodheadz 发表于 3-6-2014 14:17
比objectC好多了,但我还是不喜欢里面一些匪夷所思的地方。比如这个:
func simpleDescription() -> St ...

难道是为了支持函数式编程?
作者: woodheadz    时间: 3-6-2014 15:45
trisun 发表于 3-6-2014 14:41
习惯了就好, HasKell的语法开始看起来也比较怪:

addVectors :: (Num a) => (a, a) -> (a, a) -> (a, ...

是,这些都不是很大的问题,习惯了也没啥。毕竟比起objectC来,swift已经算是很漂亮了。

我只是觉得苹果在编程语言上的审美水平和他们在ID设计,UI设计方面的审美水平差距实在太大了点。
作者: iforget    时间: 3-6-2014 19:20
Jay@Au 发表于 3-6-2014 14:27
let 定义常量。 var 跟javascript 一样。

估计适应就好了。 比较objc,是从笨拙走向轻巧

泥马follow 一下var 也没人说你苹果弱,造名词干嘛泥
作者: iforget    时间: 3-6-2014 19:22
trisun 发表于 3-6-2014 14:41
习惯了就好, HasKell的语法开始看起来也比较怪:

addVectors :: (Num a) => (a, a) -> (a, a) -> (a, ...

人家玩arrow那是直接一一映射到数学定义上,不完全是为了语法而语法
作者: cais    时间: 3-6-2014 20:28
woodheadz 发表于 3-6-2014 14:33
那是不一样的。
swift这个存粹是拿来指定函数返回值类型的,我觉得根据它的变量定义方式 “let a:Stri ...

你说的是这个吧:
var mathFunction: (Int, Int) -> Int = addTwoInts

它的->是指函数的返回值的类型,不是整个函数的类型。

总体来说,这个swift看起来还是不错的。近来很多新的语言特点都有了。
还有那个playground也是比较先进的编程概念。不错。
作者: DDD888    时间: 3-6-2014 21:47
是挺不错的
作者: ubuntuhk    时间: 3-6-2014 22:04
woodheadz 发表于 3-6-2014 14:45
是,这些都不是很大的问题,习惯了也没啥。毕竟比起objectC来,swift已经算是很漂亮了。

我只是觉得苹 ...


可能主要是因为Jobs不会编程,否则不得给他骂死。。。
作者: woodheadz    时间: 3-6-2014 22:08
cais 发表于 3-6-2014 19:28
你说的是这个吧:

它的->是指函数的返回值的类型,不是整个函数的类型。

当然,我说的就是返回值类型。

以下面这个函数为例:
  1. func sayHello(personName: String) -> String {
  2.     let greeting = "Hello, " + personName + "!"
  3.     return greeting
  4. }
复制代码
如果设计为这样:
  1. func sayHello(personName: String): String {
  2.     let greeting = "Hello, " + personName + "!"
  3.     return greeting
  4. }
复制代码
是不是会更自然? 而且这样也和定义变量类型的方式(见下)统一。
  1. var welcomeMessage: String
复制代码

作者: iforget    时间: 4-6-2014 00:03
woodheadz 发表于 3-6-2014 21:08
当然,我说的就是返回值类型。

以下面这个函数为例:如果设计为这样:是不是会更自然? 而且这样也和定 ...

这样自然跟scala接近了
arrow在范畴学里标示函数,设计上必须是学院派出身,本身没问题,就是稍显死板
作者: cais    时间: 4-6-2014 00:46
woodheadz 发表于 3-6-2014 21:08
当然,我说的就是返回值类型。

以下面这个函数为例:如果设计为这样:是不是会更自然? 而且这样也和定 ...

如果是用: 来表示返回值类型的话,那函数类型的变量怎么样表示呢?是下面这样吗?
  1. var sayHello : (String): String
复制代码

作者: cais    时间: 4-6-2014 00:51
iforget 发表于 3-6-2014 23:03
这样自然跟scala接近了
arrow在范畴学里标示函数,设计上必须是学院派出身,本身没问题,就是稍显死板

scala 用=>,swift用->,看起来都差不多啦。
作者: woodheadz    时间: 4-6-2014 01:13
cais 发表于 3-6-2014 23:46
如果是用: 来表示返回值类型的话,那函数类型的变量怎么样表示呢?是下面这样吗?

类型的声明和变量定义本来就不该放在一起。 你这个例子可以分为两行代码,第一行声明函数类型(函数签名),第二行用这个类型定义变量。
为了能够在声明函数类型的同时定义变量,而采取箭头这种不自然并且缺乏一致性的设计,这在我看来未免有捡了芝麻丢了西瓜之嫌。

作者: superopengl    时间: 4-6-2014 04:31
Good. Apple终于开窍了
作者: DDD888    时间: 4-6-2014 13:55
问一下,是否该编程语言已经推出?是要下载新的xcode吗?
作者: Jay@Au    时间: 4-6-2014 14:15
DDD888 发表于 4-6-2014 12:55
问一下,是否该编程语言已经推出?是要下载新的xcode吗?

beta版本,不过dev member才能下,交99刀那种
作者: simpledream    时间: 4-6-2014 14:35
大家打算什么时候换?
作者: DDD888    时间: 4-6-2014 15:13
Jay@Au 发表于 4-6-2014 13:15
beta版本,不过dev member才能下,交99刀那种

那不错,我应该可以下啦
作者: cais    时间: 4-6-2014 22:16
woodheadz 发表于 4-6-2014 00:13
类型的声明和变量定义本来就不该放在一起。 你这个例子可以分为两行代码,第一行声明函数类型(函数签名) ...

给个例子比较容易理解。
作者: woodheadz    时间: 4-6-2014 22:38
本帖最后由 woodheadz 于 4-6-2014 21:46 编辑
cais 发表于 4-6-2014 21:16
给个例子比较容易理解。


我的意思就是沿用传统做法,例如这样:
  1. func SayHelloCallback():string;
  2. var sayHello:SayHelloCallback;
复制代码
回调函数在设计上约等于只拥有一个函数的接口定义。换句话说,当一个模块要求用一个函数变量输入回调函数时,他实际上是用函数签名描述了一个交互协议,要求调用者按协议(函数签名)编写函数。
所以为函数类型取一个名字是很有必要的做法。另外这也是省力的做法,否则你至少需要把同一个函数签名写上两遍。

我不知道你这种写法swift是否支持。如果支持,那么swift这个做法实际上是提供了一种“匿名函数类型”(不是匿名函数)的写法,我实在想不出这种写法有什么优势。
作者: cais    时间: 4-6-2014 22:59
本帖最后由 cais 于 5-6-2014 11:02 编辑

如果有在MQ的同学,可以参加https://wiki.mq.edu.au/display/plrg/PL+Reading+Group

这个星期五就是很应时的讨论swift。 做PL的可能是少数几个跟工业界关系紧密的研究领域吧。

我没去参加过。不知道他们的讨论理论性有多强。

@karl.lee.2004  
作者: iforget    时间: 4-6-2014 22:59
woodheadz 发表于 4-6-2014 21:38
我的意思就是沿用传统做法,例如这样:回调函数在设计上约等于只拥有一个函数的接口定义。换句话说,当 ...

你的观点scala表示支持
作者: cais    时间: 4-6-2014 23:25
本帖最后由 cais 于 4-6-2014 22:26 编辑
woodheadz 发表于 4-6-2014 21:38
我的意思就是沿用传统做法,例如这样:回调函数在设计上约等于只拥有一个函数的接口定义。换句话说,当 ...


你的理解是对的。
但是我不赞同 “匿名函数类型” 是不必要的的观点。
就以apple 网站上的例子:https://developer.apple.com/libr ... 014097-CH10-XID_204
  1. func addTwoInts(a: Int, b: Int) -> Int {
  2.     return a + b
  3. }
  4. func multiplyTwoInts(a: Int, b: Int) -> Int {
  5.     return a * b
  6. }
复制代码
The type of both of these functions is (Int, Int) -> Int. This can be read as:

“A function type that has two parameters, both of type Int, and that returns a value of type Int.”
  1. var mathFunction: (Int, Int) -> Int = addTwoInts
复制代码
This can be read as:

“Define a variable called mathFunction, which has a type of ‘a function that takes two Int values, and returns an Int value.’ Set this new variable to refer to the function called addTwoInts.”

我觉得就是很好的例子。在定义"mathFunction"的时候,的确是没必要再重新给“(Int, Int) -> Int”起个名字,因为只用到一次。
用函数来当另一个函数的参数或返回值也是同样道理。
要起个名字也不是不行,不过这个Swift好像没有提供类似于C的typedef一类的东西。还没看完。目前看到的自定义的type就是class跟struct。好像没有可以像haskell那样可以自由定义新的type的语法。
以上addTwoInts跟multiplyTwoInts其实定义的是实现,是对于"(Int, Int) -> Int“这个函数类型的实现,并不是定义了函数类型本身。
你说的以下用法是有问题的。
  1. var sayHello : SayHelloCallback;
复制代码
假设swift可以自动推导类型的话,最多也只是写成
  1. var sayHello = SayHelloCallback;
复制代码
此外匿名函数对于closure的用处也很大:https://developer.apple.com/libr ... 014097-CH11-XID_117
作者: woodheadz    时间: 4-6-2014 23:40
本帖最后由 woodheadz 于 4-6-2014 22:42 编辑
cais 发表于 4-6-2014 22:25
你的理解是对的。
但是我不赞同 “匿名函数类型” 是不必要的的观点。
就以apple 网站上的例子:http ...


你这个例子里还漏了一个角色,就是回调函数的调用者。它很可能是这样的:
  1. func callMathFunction(mathFunction: (Int, Int) -> Int ){
  2.     mathFunction(1,2);
  3. }
复制代码
加上这个,你是不是又把函数签名写了一遍?


在C#里, 你可以这样:
  1. delegate int MathFunc(int, int);

  2. int callMathFunc(MathFunc func)
  3. {
  4.     func(1,2);
  5. }

  6. var func = multiplyTwoInts;
  7. callMathFunc(func);
复制代码
你看这是不是不需要使用->这么奇怪的语法?

用:来替换->其实根本不影响匿名函数。例如你这么来代码也很清楚:
  1. callMathFunc((a:int,b:int): int
  2. {
  3.     return a+b;
  4. })
复制代码

作者: cais    时间: 4-6-2014 23:55
woodheadz 发表于 4-6-2014 22:40
你这个例子里还漏了一个角色,就是回调函数的调用者。它很可能是这样的:加上这个,你是不是又把函数签 ...

用:替换->的话,定义"匿名函数“变量的时候会有点怪
  1. var aMathFunc : (int, int) : int;
复制代码
语法上能不产生歧义的话,就看个人习惯了。

能够支持匿名函数,让语言灵活一点,我觉得挺好的。
如果你喜欢每个函数类型都给个名字,这也是个好的编程习惯。但是强求每个函数类型都这样,就不一定是好事了。
感觉有点像进入了类似应不应该用Pair一类的东西的讨论了
http://sysmagazine.com/posts/123790/

作者: woodheadz    时间: 5-6-2014 00:22
cais 发表于 4-6-2014 22:55
用:替换->的话,定义"匿名函数“变量的时候会有点怪语法上能不产生歧义的话,就看个人习惯了。

能够支 ...

我关键的point其实是,“匿名函数类型”这种东西无论从省代码量的角度还是从提高代码阅读性的角度都没有存在的价值。
匿名函数现在主流语言都支持,不过我是第一次看到有“匿名函数类型”这种东西出现。和用“->”来替换“:”一样,都是我无法理解的设计。
因此我认为swift的设计者功力还是不能和anders这样的大师比。

不过考虑到swift是用来替代objectC,我就完全释然了。只要能取代objectC这样东西,swift就算在怪异点,我也要点个赞!
作者: black_zerg    时间: 5-6-2014 02:04
提示: 作者被禁止或删除, 无法发言 反正语言么能自圆其说就行,新语言差不到哪里去。 一家一门语言,不愁没东西学
作者: DDD888    时间: 5-6-2014 08:52
Jay@Au 发表于 4-6-2014 13:15
beta版本,不过dev member才能下,交99刀那种

我看了下,没有xcode 6 beta给我下载
作者: Jay@Au    时间: 5-6-2014 10:42
DDD888 发表于 5-6-2014 07:52
我看了下,没有xcode 6 beta给我下载

我没有交99,所以看不到。你是交了99的会员应该可以看到啊, https://developer.apple.com/devcenter/ios/index.action 这个页面里面找不到下载链接?
作者: DDD888    时间: 5-6-2014 10:46
Jay@Au 发表于 5-6-2014 09:42
我没有交99,所以看不到。你是交了99的会员应该可以看到啊, https://developer.apple.com/devcenter/ios ...

这是复制下来的内容

OS X Mavericks         OS X Yosemite Developer Preview
Developing for OS X Mavericks

Resources for OS X Mavericks

Downloads
Downloads
Download the latest build of OS X.
Ref Lib
Mac Developer Library
Articles
Getting Started
Guides
Reference
Release Notes
Sample Code
Technical Notes
Technical Q&As
Videos
Development Videos
WWDC 2013
Featured Content

OS X Mavericks for Developers
OS X Mavericks API Diffs
Distributing Your Mac Apps
Submitting to the Mac App Store
App Sandboxing
Developer ID and Gatekeeper
Map Kit Framework Reference
In-App Purchase
Game Center
OpenCL
OpenGL
High Resolution
Push Notifications
Notification Programming Guide for Websites
iCloud
Downloads

Before You Download OS X Mavericks from the Mac App Store
Ensure you are using a 64-bit, Intel-based Mac running either Mac OS X v10.6.7 Snow Leopard or later.
You must have at least 8GB of free disk space to install OS X Mavericks.
Xcode 5.0.1 is required to develop applications for OS X Mavericks.
作者: Jay@Au    时间: 5-6-2014 13:06
DDD888 发表于 5-6-2014 09:46
这是复制下来的内容

OS X Mavericks         OS X Yosemite Developer Preview

估计链接的确不好找, 看看这个帖子http://apple.stackexchange.com/q ... wnload-xcode-6-beta , 我不是member不好试
作者: 蒙面超人    时间: 5-6-2014 13:22
那原来那些苦学objective c的人岂不是哭死?程序猿果然不是人啊。。。
作者: DDD888    时间: 5-6-2014 13:47
Jay@Au 发表于 5-6-2014 12:06
估计链接的确不好找, 看看这个帖子http://apple.stackexchange.com/questions/132842/where-can-i-downl ...

找到了
作者: DDD888    时间: 5-6-2014 14:25
装好了,确实是有swift的选择的
作者: cais    时间: 5-6-2014 14:52
不知道是不是只能跑在iOS8上面。
不过苹果push update的能力很强,应该很快就可以把大部分的iphone, ipad都更新成iOS8
参考:http://www.businessinsider.com.au/chart-of-the-day-apples-impressive-lack-of-mobile-fragmentation-2013-6
http://www.businessinsider.com.au/chart-of-the-day-ios-vs-android-fragmentation-2012-6
作者: DDD888    时间: 5-6-2014 14:57
cais 发表于 5-6-2014 13:52
不知道是不是只能跑在iOS8上面。
不过苹果push update的能力很强,应该很快就可以把大部分的iphone, ipad都 ...

我是痛恨苹果的update,如果不跟新,那update的标志让我心烦

但我决不会去跟新我的ipod touch 5,如果跟新,我的ipod touch 5就废掉了,因为那里边的cpu的速度不是很快
作者: iap    时间: 5-6-2014 16:05
Object-C现在用的很顺手,又得换swift,希望swift不要让我们失望
作者: iap    时间: 5-6-2014 16:09
cais 发表于 5-6-2014 13:52
不知道是不是只能跑在iOS8上面。
不过苹果push update的能力很强,应该很快就可以把大部分的iphone, ipad都 ...

怎么可能只在IOS8上跑,都编译成2进制了
作者: iap    时间: 5-6-2014 16:20
woodheadz 发表于 3-6-2014 21:08
当然,我说的就是返回值类型。

以下面这个函数为例:如果设计为这样:是不是会更自然? 而且这样也和定 ...

如果给一个非程序员解释一下,他会觉得 -> 更自然,因为很容易就理解成前面的函数“推出”后面的返回值
作者: DDD888    时间: 5-6-2014 20:49
cais 发表于 5-6-2014 13:52
不知道是不是只能跑在iOS8上面。
不过苹果push update的能力很强,应该很快就可以把大部分的iphone, ipad都 ...

我测试过了,可以在ios 7.0.4上跑啦




欢迎光临 FreeOZ论坛 (https://www.freeoz.org/bbs/) Powered by Discuz! X3.2