ObjC/Swift Ruby 程序员写 Swift 毫无压力

quakewang · 2014年06月03日 · 最后由 chanshunli 回复于 2015年01月18日 · 24128 次阅读
本帖已被管理员设置为精华贴

花半个小时看了一下 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

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

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

看着比较像 Go

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

我觉得像 typescript...

先赞了再说……

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

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

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

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

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

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

Hash 和 Ruby 1.9 的 Hash 写法很像

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

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

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

直接 swift

直接 swift

#16 楼 @Tim_Lang Playground?

还是觉得 RubyMotion 要好很多……

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

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

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

感觉像 Python 更多一些

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

let 声明常量这个怪怪的

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

脚本语言啊。。。

匿名 #31 2014年06月03日

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

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

#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 怎么实现?

匿名 #34 2014年06月03日

可以写 MacOX 10.9 的应用?

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

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

谢谢

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

匿名 #38 2014年06月03日

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

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

#40 楼 @kewin 翻译下?…

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

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

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

只要不像 oc 就好。

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

学细了。

#48 楼 @luikore 果然是大众脸

希望 swift 能够尽快跨平台。

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

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

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

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

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

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

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

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

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

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

感觉好利害的样子

怎么看 rubychina 的源码啊

看着很亲切。

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

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

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

例如 swift 中

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

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

PHP 宇宙第一!

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

心疼 ruby motion 的钱

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

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

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

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

看着像 C++

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

what DHH tals about Swift?

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

不明觉厉。

#72 楼 @sabri 肯定相似的!

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

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

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

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

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

熟悉 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'

刚开始看 swift,求指教

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

匿名 #88 2015年01月18日

闭包和 ruby 里的太像了:)

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