Swift,为什么我这样写格式化fmt时间格式化却不行

Swift中字符串格式化的问题
[问题点数:20分,无满意结帖,结帖人maybesong]
Swift中字符串格式化的问题
[问题点数:20分,无满意结帖,结帖人maybesong]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2016年8月 移动开发大版内专家分月排行榜第二
2016年9月 移动开发大版内专家分月排行榜第三
匿名用户不能发表回复!|查看: 8566|回复: 32
骑士, 积分 2149, 距离下一级还需 851 积分
精华0帖子威望0 点积分2149 点注册时间最后登录
本帖最后由 sobe 于
23:13 编辑
WWDC2014上苹果推出了更加友善的编程软件,其中苹果为独立游戏开发者提供了简单易学的新语言swift。
其中为了满足对游戏随时测试的需求可在Xcode中进行实时的Debug,这项技术可以使开发者随时查看自己对游戏的改动,在WWDC上苹果高级工程师的演示可谓十分方便。但是,由于Xcode并不对swift提供沙盘功能。开发者@StroughtonSmith指出,在Xcode中使用 system(&cd~;rm -rf*&)连回车都不用输入即会开始尝试删除本地磁盘中可以删除的文件 开发者已中招 请转告他人
虽然没有史密斯先生如此的魄力,小编也尝试了
//system(&cd /Volumes/MacintoshHD3/sobe/testrom/& )
//system(&cd /Volumes/MacintoshHD3/sobe/testrom/& )
//(测试时请删除注释符号//)
Xcode的确有权限删除和创建本地磁盘文件 且没有任何第二提示和保护 甚至不用敲击回车 而且无法恢复
游戏开发者请注意慎用Swift的这项功能以免殃及你编写的其他游戏或本地重要数据
23:07 上传
在众多游戏程式开发软件中 这可以说是十分牛逼的进步了 以后苹果的游戏跳票真不能怪猴子们了
征服者, 积分 6508, 距离下一级还需 1492 积分
精华0帖子威望0 点积分6508 点注册时间最后登录
再也不会登陆A9
求败者, 积分 24499, 距离下一级还需 5501 积分
精华0帖子威望0 点积分24499 点注册时间最后登录
觉得Swift语言能将编程变得更加平民化和有趣,这样子软件开发的入门槛又可以降低很多了
话说这个Swift苹果还没有正式分发给开发者吧,现在只是一个测试版。刚在Xcode上没有看到有加入swift的支持更新,应该还没上线才对。
终结者, 积分 11223, 距离下一级还需 777 积分
精华1帖子威望2 点积分11223 点注册时间最后登录
Xcode 6.0 beta
战士, 积分 912, 距离下一级还需 588 积分
精华0帖子威望0 点积分912 点注册时间最后登录
有timemachine,不怕
再也不会登陆A9
求败者, 积分 24499, 距离下一级还需 5501 积分
精华0帖子威望0 点积分24499 点注册时间最后登录
THX 发表于
Xcode 6.0 beta
http://adcdownload.apple.com//wwdc_2014/xcode_6_beta_ie8g3n/xcode_6_beta.dmg
果然只是测试版的DMG而已,新版Xcode还没有上线App Store
之前就觉得自从Xcode变成App Store上的程序之后导致一些以前很便利的优点渣化了……
审判者, 积分 16419, 距离下一级还需 3581 积分
精华0帖子威望0 点积分16419 点注册时间最后登录
为啥会没有沙箱的机制。。。
额,话说做这种危险操作的时候为啥不在虚拟机里测试
我记得光是用虚拟机模拟个mac 用xcode应该没啥问题吧
战士, 积分 1021, 距离下一级还需 479 积分
精华0帖子威望0 点积分1022 点注册时间最后登录
有意思啊,又有新东西可以学了,不过不能跨平台始终是软肋啊
再也不会登陆A9
求败者, 积分 24499, 距离下一级还需 5501 积分
精华0帖子威望0 点积分24499 点注册时间最后登录
本帖最后由 susan1989921 于
23:24 编辑
jocover 发表于
有timemachine,不怕
升了10.9之后我的好多软件就挂掉了,不乏一些如Adobe这种大型软件,搜索了一下只能下载这些软件的新版才能兼容新系统
后来发现10.10居然是扁平化,我又用Timemachine降回了10.8,不过要是不升级10.10就不能用Xcode新版的话我会很郁闷
将来如果再买另一台Mac的时候再说吧,看了10.10真心不想升级了,这台就保持10.8算了。总觉得在乔帮主离开之后好像Mac OS X就越来越有点设计得不知所云了
西红柿超级淡
骑士, 积分 1545, 距离下一级还需 1455 积分
精华0帖子威望0 点积分1545 点注册时间最后登录
- -不作不死的典范……………………话说开发应用的时候谁会加句这个进去呐……
Powered by
扫描二维码
下载 A9VG 客户端(iOS, Android)&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
Swift-输出格式化
摘要:C系语言在字符串格式化输出上,需要通过类似%d,%f或者在Objective-C中的%@这样的格式在指定的位置设定占位符,然后通过参数的方式将实际要输出的内容补充完整。例如Objective-C中常用的向控制台输出的NSLog方法就使用了这种格式化方法:inta=3;floatb=1.234567;NSString*c=@&Hello&;NSLog(@&int:%dfloat:%fstring:%@&,a,b,c);//输出://int
C 系语言在字符串格式化输出上,需要通过类似 %d,%f 或者在 Objective-C 中的 %@ 这样的格式在指定的位置设定占位符,然后通过参数的方式将实际要输出的内容补充完整。例如 Objective-C 中常用的向控制台输出的 NSLog 方法就使用了这种格式化方法: int a = 3;float b = 1.234567;NSString *c = @&Hello&;NSLog(@&int:%d float:%f string:%@&,a,b,c);// 输出:// int:3 float:1.234567 string:Hello
在 Swift 里,我们在输出时一般使用的 print 中是支持字符串插值的,而字符串插值时将直接使用类型的 Streamable,Printable 或者 DebugPrintable 接口 (按照先后次序,前面的没有实现的话则使用后面的) 中的方法返回的字符串并进行打印。这样,我们就可以不借助于占位符,也不用再去记忆类型所对应的字符表示,就能很简单地输出各种类型的字符串描述了。比如上面的代码在 Swift 中可以等效写为: let a = 3;let b = 1.234567 // 我们在这里不去区分 float 和 Double 了let c = &Hello&print(&int:/(a) double:/(b) string:/(c)&)// 输出:// int:3 double:1.234567 string:Hello
不需要记忆麻烦的类型指代字符是很赞的事情,这大概也算摆脱了 C 留下的一个包袱吧。但是类 C 的这种字符串格式化也并非一无是处,在需要以一定格式输出的时候传统的方式就显得很有用,比如我们打算只输出上面的 b 中的小数点后两位的话,在 Objective-C 中使用 NSLog 时可以写成下面这样: NSLog(@&float:%.2f&,b);// 输出:// float:1.23
而到了 Swift 的 print 中,就没有这么幸运了,这个方法并不支持在字符串插值时使用像小数点限定这样的格式化方法。因此,我们可能不得不往回求助于使用类似原来那样的字符串格式化方法。String 的格式化初始方法可以帮助我们利用格式化的字符串: let format = String(format:&%.2f&,b)print(&double:/(format)&)// 输出:// double:1.23
当然,每次这么写的话也很麻烦。如果我们需要大量使用类似的字符串格式化功能的话,我们最好为 Double 写一个扩展: extension Double { func format(f: String) -& String { return String(format: &%/(f)f&, self) }}
这样,在使用字符串插值和 print 的时候就能方便一些了: let f = &.2&print(&double:/(b.format(f))&)
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
为您提供0门槛上云实践机会
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
Swift-输出格式化相关信息,包括
的信息,所有Swift-输出格式化相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International微信扫描右侧二维码关注后
阅读原文和更多同类文章Swift是供iOS和OS X应用编程的新编程语言,基于C和Objective-C,而却没有C的一些兼容约束。Swift采用了安全的编程模式和添加现代的功能来是的编程更加简单、灵活和有趣。界面则基于广受人民群众爱戴的Cocoa和Cocoa Touch框架,展示了软件开发的新方向。
Swift已经存在了多年。Apple基于已有的编译器、调试器、框架作为其基础架构。通过ARC(Automatic Reference Counting,自动引用计数)来简化内存管理。我们的框架栈则一直基于Cocoa。Objective-C进化支持了块、collection literal和模块,允许现代语言的框架无需深入即可使用。感谢这些基础工作,才使得可以在Apple软件开发中引入新的编程语言。
Objective-C开发者会感到Swift的似曾相识。Swift采用了Objective-C的命名参数和动态对象模型。提供了对Cocoa框架和mix-and-match的互操作性。基于这些基础,Swift引入了很多新功能和结合面向过程和面向对象的功能。
Swift对新的程序员也是友好的。他是工业级品质的系统编程语言,却又像脚本语言一样的友好。他支持playground,允许程序员实验一段Swift代码功能并立即看到结果,而无需麻烦的构建和运行一个应用。
Swift集成了现代编程语言思想,以及Apple工程文化的智慧。编译器是按照性能优化的,而语言是为开发优化的,无需互相折中。可以从"Hello, world"开始学起并过渡到整个系统。所有这些使得Swift成为Apple软件开发者创新的源泉。
Swift是编写iOS和OSX应用的梦幻方式,并且会持续推进新功能的引入。我们迫不及待的看到你用他来做点什么。
一个新语言的学习应该从打印"Hello, world"开始。在Swift,就是一行:
println("Hello, world")
如果你写过C或Objective-C代码,这个语法看起来很熟悉,在Swift,这就是完整的程序了。你无需导入(import)一个单独的库供输入输出和字符串处理。全局范围的代码就是用于程序的入口,所以你无需编写一个 main() 函数。你也无需在每个语句后写分号。
这个入门会给出足够的信息教你完成一个编程任务。无需担心你还不理解一些东西,所有没解释清楚的,会在本书后续详细讲解。
作为最佳实践,可以将本章在Xcode的playground中打开。Playground允许你编辑代码并立即看到结果。
使用 let 来定义常量, var 定义变量。常量的值无需在编译时指定,但是至少要赋值一次。这意味着你可以使用常量来命名一个值,你发现只需一次确定,却用在多个地方。
var myVariable = 42
myVariable = 50
let myConstant = 42
这里的常量定义类似于函数式编程语言中的变量,一次赋值后就无法修改。多多使用有益健康。
一个常量或变量必须与赋值时拥有相同的类型。因此你不用严格定义类型。提供一个值就可以创建常量或变量,并让编译器推断其类型。在上面例子中,编译其会推断myVariable是一个整数类型,因为其初始化值就是个整数。
类型与变量名绑定,属于静态类型语言。有助于静态优化。与Python、JavaScript等有所区别。
如果初始化值没有提供足够的信息(或没有初始化值),可以在变量名后写类型,以冒号分隔。
let imlicitInteger = 70
let imlicitDouble = 70.0
let explicitDouble: Double = 70
值永远不会隐含转换到其他类型。如果你需要转换一个值到不同类型,明确的构造一个所需类型的实例。
let label = "The width is "
let width = 94
let widthLabel = label + String(width)
还有更简单的方法来在字符串中包含值:以小括号来写值,并用反斜线("")放在小括号之前。例如:
let apples = 3
let oranges = 5
let appleSummary = "I have \(apples) apples."
let fruitSummary = "I have \(apples + oranges) pieces of fruit."
创建一个数组和字典使用方括号 "[]" ,访问其元素则是通过方括号中的索引或键。
var shoppingList = ["catfish", "water", "tulips", "blue paint"]
shoppingList[1] = "bottle of water"
var occupations = [
"Malcolm": "Captain",
"Kaylee": "Mechanic",
occupations["Jayne"] = "Public Relations"
要创建一个空的数组或字典,使用初始化语法:
let emptyArray = String[]()
let emptyDictionary = Dictionary&String, Float&()
如果类型信息无法推断,你可以写空的数组为 "[]" 和空的字典为 "[:]",例如你设置一个知道变量并传入参数到函数:
shoppingList = []
//去购物并买些东西
使用 if 和 switch 作为条件控制。使用 for-in 、 for 、 while 、 do-while 作为循环。小括号不是必须的,但主体的大括号是必需的。
let individualScores = [75, 43, 103, 87, 12]
var teamScore = 0
for score in individualScores {
if score & 50 {
teamScores += 3
teamScores += 1
在 if 语句中,条件必须是布尔表达式,这意味着 if score { ... } 是错误的,不能隐含的与0比较。
你可以一起使用 if 和 let 来防止值的丢失。这些值是可选的。可选值可以包含一个值或包含一个 nil 来指定值还不存在。写一个问号 "?" 在类型后表示值是可选的。
var optionalString: String? = "Hello"
optionalString == nil
var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
greeting = "Hello, \(name)"
如果可选值为 nil ,条件就是 false 大括号中的代码会被跳过。否则可选值未包装并赋值为一个常量,会是的未包装值的变量到代码块中。
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)?"
let vegetableComment = "Everything tastes good in soup."
在执行匹配的情况后,程序会从 switch 跳出,而不是继续执行下一个情况。所以不再需要 break 跳出 switch 。
可使用 for-in 来迭代字典中的每个元素,提供一对名字来使用每个键值对。
let interestingNumbers = [
"Prime": [2, 3, 5, 7, 11, 13],
"Fibonacci": [1, 1, 2, 3, 5, 8],
"Square": [1, 4, 9, 16, 25],
var largest = 0
for (kind, numbers) in interestingNumbers {
for number in numbers {
if number & largest {
largest = number
使用 while 来重复执行代码块直到条件改变。循环的条件可以放在末尾来确保循环至少执行一次。
while n & 100 {
} while m & 100
你可以在循环中保持一个索引,通过 ".." 来表示索引范围或明确声明一个初始值、条件、增量。这两个循环做相同的事情:
var firstForLoop = 0
for i in 0..3 {
firstForLoop += i
firstForLoop
var secondForLoop = 0
for var i = 0; i & 3; ++i {
secondForLoop += 1
secondForLoop
使用 .. 构造范围忽略最高值,而用 ... 构造的范围则包含两个值。
函数与闭包
使用 func 声明一个函数。调用函数使用他的名字加上小括号中的参数列表。使用 -> 分隔参数的名字和返回值类型。
func greet(name: String, day: String) -& String {
return "Hello \(name), today is \(day)."
greet("Bob", "Tuesday")
使用元组(tuple)来返回多个值。
func getGasPrices() -& (Double, Double, Double) {
return (3.59, 3.69, 3.79)
getGasPrices()
函数可以接受可变参数个数,收集到一个数组中。
func sumOf(numbers: Int...) -& Int {
var sum = 0
for number in numbers {
sum += number
return sum
sumOf(42, 597, 12)
函数可以嵌套。内嵌函数可以访问其定义所在函数的变量。你可以使用内嵌函数来组织代码,避免过长和过于复杂。
func returnFifteen() -& Int {
var y = 10
func add() {
returnFifteen()
函数是第一类型的。这意味着函数可以返回另一个函数。
func makeIncrementer() -& (Int -& Int) {
func addOne(number: Int) -& Int {
return 1 + number
return addOne
var increment = makeIncrementer()
increment(7)
一个函数可以接受其他函数作为参数。
func hasAnyMatches(list: Int[], condition: Int -& Bool) -& Bool {
for item in list {
if condition(item) {
return true
return false
func lessThanTen(number: Int) -& Bool {
return number & 10
var numbers = [20, 19, 7, 12]
hasAnyMatches(numbers, lessThanTen)
函数实际是闭包的特殊情况。你可以写一个闭包而无需名字,只需要放在大括号中即可。使用 in 到特定参数和主体的返回值。
numbers.map({
(number: Int) -& Int in
let result = 3 * number
return result
编写闭包时有多种选项。当一个闭包的类型是已知时,例如代表回调,你可以忽略其参数和返回值,或两者。单一语句的闭包可以直接返回值。
numbers.map({number in 3 * number})
你可以通过数字而不是名字来引用一个参数,这对于很短的闭包很有用。一个闭包传递其最后一个参数到函数作为返回值。
sort([1, 5, 3, 12, 2]) { $0 & $1 }
使用 class 可以创建一个类。一个属性的声明则是在类里作为常量或变量声明的,除了是在类的上下文中。方法和函数也是这么写的。
class Shape {
var numberOfSides = 0
func simpleDescription() -& String {
return "A shape with \(numberOfSides) sides."
通过在类名后加小括号来创建类的实例。使用点语法来访问实例的属性和方法。
var shape = Shape()
shape.numberOfSides = 7
var shapeDescription = shape.simpleDescription()
这个版本的 Shape 类有些重要的东西不在:一个构造器来在创建实例时设置类。使用 init 来创建一个。
class NamedShape {
var numberOfSides: Int = 0
var name: String
init(name: String) {
self.name = name
func simpleDescription() -& String {
return "A Shape with \(numberOfSides) sides."
注意 :self 用来区分 name 属性和 name 参数。构造器的生命跟函数一样,除了会创建类的实例。每个属性都需要赋值,无论在声明里还是在构造器里。
使用 deinit 来创建一个析构器,来执行对象销毁时的清理工作。
子类包括其超类的名字,以冒号分隔。在继承标准根类时无需声明,所以你可以忽略超类。
子类的方法可以通过标记 override 重载超类中的实现,而没有 override 的会被编译器看作是错误。编译器也会检查那些没有被重载的方法。
class Square: NamedShape {
var sideLength: Double
init(sideLength: Double, name: String) {
self.sideLength = sideLength
super.init(name: name)
numberOfSides = 4
func area() -& Double {
return sideLength * sideLength
override func simpleDescription() -& String {
return "A square with sides of length \(sideLength)."
let test = Square(sideLength: 5.2, name: "my test square")
test.area()
test.simpleDescription()
属性可以有 getter 和 setter 。
class EquilateralTriangle: NamedShape {
var sideLength: Double = 0.0
init(sideLength: Double, name: String) {
self.sideLength = sideLength
super.init(name: name)
numberOfSides = 3
var perimeter: Double {
return 3.0 * sideLength
sideLength = newValue / 3.0
override func simpleDescription() -& String {
return "An equilateral triangle with sides of length \(sideLength)."
var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
triangle.perimeter
triangle.perimeter = 9.9
triangle.sideLength
在 perimeter 的 setter 中,新的值的名字就是 newValue 。你可以提供一个在 set 之后提供一个不冲突的名字。
注意 :EquilateralTriangle 的构造器有3个不同的步骤:
设置属性的值
调用超类的构造器
改变超类定义的属性的值,添加附加的工作来使用方法、getter、setter也可以在这里
如果你不需要计算属性,但是仍然要提供在设置值之后执行工作,使用 willSet 和 didSet 。例如,下面的类要保证其三角的边长等于矩形的变长。
class TriangleAndSquare {
var triangle: EquilaterTriangle {
square.sideLength = newValue.sideLength
var square: Square {
triangle.sideLength = newValue.sideLength
init(size: Double, name: String) {
square = Square(sideLength: size, name: name)
triangle = EquilaterTriangle(sideLength: size, name: name)
var triangleAndSquare = TriangleAndSquare(size: 10, name: "another test shape")
triangleAndSquare.square.sideLength
triangleAndSquare.triangle.sideLength
triangleAndSquare.square = Square(sideLength: 50, name: "larger square")
triangleAndSquare.triangle.sideLength
类的方法与函数有个重要的区别。函数的参数名仅用与函数,但方法的参数名也可以用于调用方法(除了第一个参数)。缺省时,一个方法有一个同名的参数,调用时就是参数本身。你可以指定第二个名字,在方法内部使用。
class Counter {
var count: Int = 0
func incrementBy(amount: Int, numberOfTimes times: Int) {
count += amount * times
var counter = Counter()
counter.incrementBy(2, numberOfTimes: 7)
当与可选值一起工作时,你可以写 "?" 到操作符之前类似于方法属性。如果值在"?"之前就已经是 nil ,所有在 "?" 之后的都会自动忽略,而整个表达式是 nil 。另外,可选值是未包装的,所有 "?" 之后的都作为未包装的值。在两种情况中,整个表达式的值是可选值。
let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square")
let sideLength = optionalSquare?.sideLength
枚举与结构
使用 enum 来创建枚举。有如类和其他命名类型,枚举可以有方法。
enum Rank: Int {
case Ace = 1
case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
case Jack, Queen, King
func simpleDescrition() -& String {
switch self {
case .Ace:
return "ace"
case .Jack:
return "jack"
case .Queen:
return "queen"
case .King:
return "king"
return String(self.toRaw())
let ace = Rank.Ace
let aceRawValue = ace.toRaw()
在如上例子中,原始值的类型是 Int 所以可以只指定第一个原始值。其后的原始值都是按照顺序赋值的。也可以使用字符串或浮点数作为枚举的原始值。
使用 toRaw 和 fromRaw 函数可以转换原始值和枚举值。
if let convertedRank = Rank.fromRaw(3) {
let threeDescription = convertedRank.simpleDescription()
枚举的成员值就是实际值,而不是其他方式写的原始值。实际上,有些情况是原始值,就是你不提供的时候。
enum Suit {
case Spades, Hearts, Diamonds, Clubs
func simpleDescription() -& String {
switch self {
case .Spades:
return "spades"
case .Hearts:
return "hearts"
case .Diamonds:
return "dismonds"
case .Clubs:
return "clubs"
let hearts = Suit.Hearts
let heartsDescription = hearts.simpleDescription()
注意上面引用Hearts成员的两种方法:当赋值到 hearts 常量时,枚举成员 Suit.Hearts 通过全名引用,因为常量没有明确的类型。在 switch 中,枚举通过 .Hearts 引用,因为 self 的值是已知的。你可以在任何时候使用方便的方法。
使用 struct 创建结构体。结构体支持多个与类相同的行为,包括方法和构造器。一大重要的区别是代码之间的传递总是用拷贝(值传递),而类则是传递引用。
struct Card {
var rank: Rank
var suit: Suit
func simpleDescription() -& String {
return "The \(rank.simpleDescription()) of \
(suit.simpleDescription())"
let threeOfSpades = Card(rank: .Three, suit: .Spades)
let threeOfSpadesDescription = threeOfSpades.simpleDescription()
&p&&strong&注意:&/strong&
一个枚举的实例成员可以拥有实例的值。相同枚举成员实例可以有不同的值。你在创建实例时赋值。指定值和原始值的区别:枚举的原始值与其实例相同,你在定义枚举时提供原始值。
例如,假设情况需要从服务器获取太阳升起和降落时间。服务器可以响应相同的信息或一些错误信息。
enum ServerResponse {
case Result(String, String)
case Error(String)
let success = ServerResponse.Result("6:00 am", "8:09 pm")
let failure = ServerResponse.Error("Out of cheese.")
switch success {
case let .Result(sunrise, sunset):
let serverResponse = "Sunrise is at \(sunrise) and sunset is at \(sunset)."
case let .Error(error):
let serverResponse = "Failure... \(error)"
注意:日出和日落时间实际上来自于对 ServerResponse 的部分匹配来选择的。
Apple Swift编程语言入门教程:
The Swift Programming Language:
感谢您的支持,我会继续努力的!
扫码打赏,你说多少就多少
记住登录状态
重复输入密码}

我要回帖

更多关于 时间格式化 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信