Swift Ruby 程序员写 Swift 毫无压力

quakewang · 发布于 2014年06月03日 · 最后由 chanshunli 回复于 2015年01月18日 · 15439 次阅读
162
本帖已被设为精华帖!

花半个小时看了一下Swift的文档,很开心地发现不需要学习它的语法,各位熟悉ruby语法的程序员就算不看文档,阅读swift代码也应该毫无压力,如果你之前熟悉apple framework的各种api,那就赶紧转移到swift开发ios应用吧,因为终于可以抛弃Objective C这个上世纪的语言了 :)

swift和ruby几个简单的对比:

swift用let定义常量,用var定义变量 swift

let maximumNumberOfLoginAttempts = 10
var currentLoginAttempt = 0

ruby无关键字,用大写字母代表常量 ruby

MAXIMUM_NUMBER_OF_LOGIN_ATTEMPTS = 10
currentLoginAttempt = 0

定义多个变量 swift

var x = 0.0, y = 0.0, z = 0.0

ruby

x, y, z = 0.0, 0.0, 0.0

字符串 swift

println("The current value of friendlyWelcome is \(friendlyWelcome)")

ruby

p "The current value of friendlyWelcome is #{friendlyWelcome}"

N进制数字和各种数字格式,完全和ruby是一模一样... swift

let decimalInteger = 17
let binaryInteger = 0b10001 // 17 in binary notation
let octalInteger = 0o21 // 17 in octal notation
let hexadecimalInteger = 0x11 // 17 in hexadecimal notation


let decimalDouble = 12.1875
let exponentDouble = 1.21875e1
let hexadecimalDouble = 0xC.3p0

let paddedDouble = 000123.456
let oneMillion = 1_000_000
let justOverOneMillion = 1_000_000.000_000_1

Tuples, swift需要定义类型组合,常用在多参数返回,而ruby则直接支持数组 swift

let http404Error = (404, "Not Found")
let (statusCode, statusMessage) = http404Error
let (justTheStatusCode, _) = http404Error

ruby

http404Error = [404, "Not Found"]
statusCode, statusMessage = http404Error
justTheStatusCode , _ = http404Error

条件绑定,这个很方便的语法糖,已经成为现代语言的标配: swift

if let actualNumber = possibleNumber.toInt() {
  println("\(possibleNumber) has an integer value of \(actualNumber)")
} else {
  println("\(possibleNumber) could not be converted to an integer")
}

ruby

if actualNumber = possibleNumber.toInt
  p "#{possibleNumber} has an integer value of #{actualNumber}"
else
  p "#{possibleNumber} could not be converted to an integer" 
end

遍历数组 swift

for item in shoppingList {
  println(item)
}

for (index, value) in enumerate(shoppingList) {
  println("Item \(index + 1): \(value)")
}

ruby

for item in shoppingList
  p item
end

#ruby的数组是Enumerable,遍历更常用each/each_with_index等方法
shoppingList.each_with_index{|value, index| p "Item #{index + 1}: #{value}"}

Dictionary swift

var airports = ["TYO": "Tokyo", "DUB": "Dublin"]
airports["LHR"] = "London"

for (airportCode, airportName) in airports {
  println("\(airportCode): \(airportName)")
}

ruby

airports = {TYO: "Tokyo", DUB: "Dublin"}
airports[:LHR] = "London"
airports.each{|airportCode, airportName| p "#{airportCode}: #{airportName}" }

Range swift

for index in 1...5 {
  println("\(index) times 5 is \(index * 5)")
}

Ruby用..表示闭合区间,...表示开合区间 ruby

(1..5).each{|index| p "#{index} times 5 is #{index * 5}"}

Closures swift

let digitNames = [
  0: "Zero", 1: "One", 2: "Two", 3: "Three", 4: "Four",
  5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine"
]
let numbers = [16, 58, 510]

let strings = numbers.map {
  (var number) -> String in
  var output = ""
  while number > 0 {
    output = digitNames[number % 10]! + output
    number /= 10
  }
  return output
}
// strings is inferred to be of type String[]
// its value is ["OneSix", "FiveEight", "FiveOneZero"]

ruby

digitNames = {
  0 => "Zero", 1 => "One", 2 => "Two", 3 => "Three", 4 => "Four", 
  5 => "Five", 6 => "Six", 7 => "Seven", 8 => "Eight", 9 => "Nine"
}
numbers = [16, 58, 510]
numbers.map do |number|
  output = ""
  while number > 0 
    output = digitNames[number % 10] + output
    number /= 10
  end
  output
end
共收到 88 条回复
202

我觉得更像python语法。无论如何,已经把swift看过一遍。

162

#1楼 @xds2000 嗯,也像js,7天7语言嘛 :)

7733

看着比较像Go

6280

- -。大杂烩,能看到各种语言的影子

2973

像coffee..

2622

我觉得像typescript...

827

先赞了再说……

6224

估计还是嫌开发iOS的人少了些

60

#1楼 @xds2000 没有缩进就比 Python 舒服太多了

12859

#1楼 @xds2000 我也觉得像Python 缩进变成大括号了麽。

172

现代编程语言一般都这么几招 不过let表示常量从哪里学来的?我记得Lisp里let是表示临时变量的 新版JS也是呢

F46600

有面向对象方面的对比吗?class,继承之类的。

3005

这下好了,用了Ruby,就不想去学Objective-C,免的忘了Ruby way

De6df3

Hash 和 Ruby 1.9 的 Hash 写法很像

5984

不知道有没有swift的类似irb,REPL的shell。

273

话说,早上一看到介绍的Swift后,我就正在看了。

56

不管像什么了... 总之很牛逼的 😄

515

直接swift

515

直接swift

2653

#16楼 @Tim_Lang Playground?

还是觉得RubyMotion要好很多……

9593

毕竟苹果官方支持 swift,RubyMotion 确实无力了

2474

swift 理念上似乎更接近 Python……

1638

看着好爽啊,哈喇子都出来了,今晚回家仔细研究一下。

4584

感觉像Python更多一些

8269

像go和python,感觉跟ruby没啥关系。

465

let声明常量这个怪怪的

13125

#28楼 @reducm 呵呵,快成js标准了吧。

10594

脚本语言啊。。。

7307

无压力 - 不能说木有门槛啊

3

招收Swift工程师,需要有两年以上经验的。 😏

449

#2楼 @quakewang

灵活的switch

Swift中的switch支持各种各样的比较操作:

let vegetable = "red pepper"
switch vegetable {
case "celery":
    let vegetableComment = "Add some raisins and make ants on a log."
case "cucumber", "watercress":
    let vegetableComment = "That would make a good tea sandwich."
case let x where x.hasSuffix("pepper"):
    let vegetableComment = "Is it a spicy \(x)?"
default:
    let vegetableComment = "Everything tastes good in soup."
}

其中的 case let x where x.hasSuffix("pepper"): ruby 怎么实现?

12224

可以写MacOX 10.9的应用?

7643

#33楼 @Victor

when /pepper$/
449

#35楼 @5swords 这两句是一个意思吗?

查了一下,果然是一个意思!有 hasPrefix 和 hasSuffix 的区分,这块似乎不像 ruby 一样支持正则

谢谢

3211

关键字let、var看着有点多余。。。 不过比代码比Objective C的好看多了。

7307

#34楼 @chanshunli 不清楚 但开发条件要就MAC OS X 10.9.3

162

#33楼 @Victor ruby的case when只是做===比较,无法做value binding

10784

#40楼 @kewin 翻译下?…

515

#41楼 @gsky Dart go Swift 都是出自企业的21世纪编程语言

10784

#42楼 @kewin :)酱紫

8972

#11楼 @iBachue let好像用作局部变量吧

1342

Dart、Go、Switf 这样的 21 世纪的语言或许都是从企业出来的呢

96

只要不像oc就好。

2880

c++

class A : Base {
  A() { ... }
}

swift

class A : Base {
  init() { ... }
}

python

a_new_instance = AClass()

swift

var a_new_instance = AClass()

groovy

foo.?bar

swift

foo?.bar
a?[3]

scala

case class Ace

swift

enum Rank: Int {
  case Ace = 1
}

C#

public int Month {
  get {
    return month;
  }
  set {
    month = value;
  }
}

swift

var Month : Int {
  get {
    return month
  }
  set {
    month = newValue
  }
}

c++

template <T>
void generic_func(T t) {
}

swift

func generic_func<T>(T t) {
}

objc protocol and category swift protocol and extension

c# out param, c++ reference swift inout

12835

学细了。

60

#48楼 @luikore 果然是大众脸

64

希望swift能够尽快跨平台。

1031

好吧, 仅针对语言来评价, 不知道为什么 Apple 不更好的支持 Ruby, 而整出了这么个语言....

可能我这些年只学了个 Ruby 的缘故吧, 看其他 新出的 语言, 都觉得不伦不类的. 呵呵

@quakewang ``actualNumber = possibleNumber.toInt 这里是不是写错了?

1031

好吧, 仅针对语言来评价, 不知道为什么 Apple 不更好的支持 Ruby, 而整出了这么个语言....

可能我这些年只学了个 Ruby 的缘故吧, 看其他 新出的 语言, 都觉得不伦不类的. 呵呵

@quakewang ``actualNumber = possibleNumber.toInt 这里是不是写错了?

1031

sorry, 发重复了 敏感时刻, 这网速, 汗~~

12638

:plus1:

7614

开发环境怎么搞,新到mac pro,开开眼

145

ios开发难在掌握sdk,语法其实不是大问题

558

语言不是问题,关键看Apple推广的决心了。

194

感觉好利害的样子

96

怎么看rubychina的源码啊

2145

看着很亲切。

172

#44楼 @ane 是的 所以弄成常量感觉很怪 还不如叫const

13463

不知道会不会跨平台将来.

2880

#62楼 @iBachue let 还有 immutable 的语义, const 可以是 mutable 的

例如 swift 中

let x: Int[] = []
x.append(3)  // can not modify immutable

var x: Int[] = []
x.append(3) // ok
9742

PHP宇宙第一!

3035

#65楼 @teemo 哈哈~ 这个拉仇恨

96

心疼 ruby motion 的钱

96

开发看来都不是问题,产品创意才是问题,最近 android 都啃上了

9484

#65楼 @teemo 其实吧,无所谓什么语言排行榜,但是我觉得Ruby反正挺适合我的、

13501

我觉得怎么都比objc好太多了

489

都这么像了,呼唤“秦始皇”,把这六国的语言统一了吧。

13006

看着像C++

96

不错,苹果公司终于进入21世纪了。

3435

#52楼 @zw963 沒有錯啊

515

what DHH tals about Swift?

2aeb4e

重点不是Swift还是OC,而是frame的API

96

不明觉厉。

96

#72楼 @sabri 肯定相似的!

1553

#51楼 @linjunhalida 有梦想总是好的

5017

ruby 还是力量不足,也没有足够金钱招募很牛的编译器开发者。

96

@zw963 swordray 5楼 · 29天前 喜欢 Swift 是编译型语言,跟动态语言千差万别

96

语法只是 工具的基础, 习惯了就自然了。

14143

果然是大众脸, 现代编程语言一般都这么几招 我觉得像

96

熟悉ruby的前辈能留个更方便的联系方式吗?最近在研究redmine 是用ruby开发的,在搭建ruby开发环境时报了好多错误,望高手指点。 "8116" C:/Bitnami/redmine-2.5.0-0/ruby/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:60:in require': cannot load such file -- initializer (LoadError) from C:/Bitnami/redmine-2.5.0-0/ruby/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:60:inrescue in require' from C:/Bitnami/redmine-2.5.0-0/ruby/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:35:in require' from C:/Users/chenaq/My Documents/Aptana RadRails Workspace/redmine/vendor/bundle/ruby/1.9.1/gems/thin-1.3.1/spec/rails_app/config/boot.rb:54:inload_initializer' from C:/Users/chenaq/My Documents/Aptana RadRails Workspace/redmine/vendor/bundle/ruby/1.9.1/gems/thin-1.3.1/spec/rails_app/config/boot.rb:39:in run' from C:/Users/chenaq/My Documents/Aptana RadRails Workspace/redmine/vendor/bundle/ruby/1.9.1/gems/thin-1.3.1/spec/rails_app/config/boot.rb:11:inboot!' from C:/Users/chenaq/My Documents/Aptana RadRails Workspace/redmine/vendor/bundle/ruby/1.9.1/gems/thin-1.3.1/spec/rails_app/config/boot.rb:109:in <top (required)>' from C:/Bitnami/redmine-2.5.0-0/ruby/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:inrequire' from C:/Bitnami/redmine-2.5.0-0/ruby/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in require' from C:/Users/chenaq/My Documents/Aptana RadRails Workspace/redmine/vendor/bundle/ruby/1.9.1/gems/thin-1.3.1/spec/rails_app/script/server:2:in' from -e:2:in load' from -e:2:in

'

10653

不错

10653

刚开始看swift,求指教

8885

#42楼 @kewin 这个语气中文不太好直译。从“来るようになった”这个措辞来看,matz的意思应该是,说不定更多的21世纪语言(比如Dart、Go、swift这类)会从企业里诞生(而不是从实验室或者学术机构或者个人开发者里)的意思。

12224

闭包和ruby里的太像了:)

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册