import Foundation
/*:
*/
var xx = 8
print("for版本1")
for i in 0..<xx {
print(i)
}
print("for版本2")
for i in stride(from: 0, to: xx, by: 1) {
print(i)
}
print("while版本1")
var i = 0
while i < xx {
print(i)
i += 1
}
print("while版本2")
i = 0
repeat {
print(i)
i += 1
} while i < xx
/*:
```
1.
let someCharacter = "z"
switch someCharacter {
case "a", "c":
doSomething(someCharacter)
default:
print("Some other character")
}
2.
let someCharacter = "z"
switch someCharacter {
case "c":
fallthrough
case "a":
doSomething(someCharacter)
break
default:
print("Some other character")
}
```
*/
print("第一种")
/*
此语句想表达的语境是,switch中a和c都调用doSomething处理
而 fallthrough 关键字不会考虑下一个case的条件是否成立
在第二种情况下,case "c" 和 case "a"的上下顺序必须紧挨
而swift中switch无需添加break,且支持复合匹配
*/
/*:
```
func findPoint(_ point: CGPoint) {
if point.x <= 0 && point.y <= 0 {
print("point at bottom left")
} else if point.x <= 0 && point.y >= 0 {
print("point at top left")
} else if point.x >= 0 && point.y >= 0 {
print("point at top right")
} else if point.x >= 0 && point.y <= 0 {
print("point at bottom right")
} else {
print("unknow")
}
}
```
*/
print("第一种方法")
var p = CGPoint(x: 2, y: 2)
switch p {
case let point where point.x <= 0 && point.y <= 0:
print("point at bottom left")
case let point where point.x <= 0 && point.y >= 0:
print("point at top left")
case let point where point.x >= 0 && point.y >= 0:
print("point at top right")
case let point where point.x >= 0 && point.y <= 0:
print("point at bottom right")
default:
print("unknow")
}
print("第二种方法")
let pp = (p.x, p.y)
switch pp {
case (...0, ...0):
print("point at bottom left")
case (...0, 0...):
print("point at top left")
case (0..., 0...):
print("point at top right")
case (0..., ...0):
print("point at bottom right")
default:
print("unknow")
}
/*:
```
1.
func test(_ someValue: Int?) -> Void {
if someValue == nil {
return
}
let notNilValue = someValue!
print(notNilValue)
}
2.
func test(_ someValue: Int?) {
guard let someValue = someValue else { return }
print(someValue)
}
```
*/
print("第二种")
/*
第一种可以用if let可选绑定去简洁一下,这个写法还是不够现代语言
第二种利用了guard语句保证后续处理值不违规,切对违规情况显示处理
*/
/*:
```
+ (void)doSomethingWithIntValue:(NSInteger)intValue
doubleValue:(double)doubleValue
block:(void(^)(CGFloat value))block;
```
*/
/* 我根据swift中使用OC枚举的转换,猜的
class func doSomething(intValue: NSInteger, doubleValue: double, block: (CGFloat) -> void);
*/
/*:
```
func somethingDeley(_ handle: () -> ()) {
//相当于OC中的GCD的 dispatch_after
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
handle()
}
}
```
*/
/*
这里这个闭包应该声明为逃逸闭包,即加上@escaping关键字如:
func somethingDeley(_ handle: @escaping () -> ())
这里这个闭包被传入了延迟队列,将在该函数返回后被调用
*/
/*:
var str = "123"
let closure = {
str += "456"
}
print(str)
closure()
print(str)
*/
/* 输出:123456
因为这里闭包进行了值捕获
*/
/*:
要求:包含入栈 stackPush 和 出栈 stackPop 的方法即可
*/
class FTSomeStack {
var stack: [Int];
func stackPush(_ newInt: Int) -> Bool {
stack.append(newInt)
return true
}
func stackPop(_ temp: inout Int) -> Bool {
guard let myTemp = stack[stack.count - 1] else {
return false
}
temp = myTemp
stack.remove(at: stack.count - 1)
return true
}
func showStack(){
for item in stack {
print(item)
}
}
init() {
// 在此处执行构造过程
}
}
var myStack = FTSomeStack()
if myStack.stackPush(2) {
myStack.showStack
}
if myStack.stackPush(4) {
myStack.showStack
}
if myStack.stackPush(6) {
myStack.showStack
}
var i = 0;
if myStack.stackPop(i) {
myStack.showStack
print(i)
}
/*:
- 闭包作为函数参数时,它的类型是什么
- 自动闭包函数作为参数时,它的类型是什么
-
*/
/*
var customersInLine = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
//闭包作为参数
func serve(customer customerProvider: <
print("Now Serving \(customerProvider())!")
}
serve(customer: { customersInLine.remove(at: 0) } ) // 正常 此处的参数是啥
serve(customer: customersInLine.remove(at: 0) ) // 编译报错 为什么,如何才能这样调用
//自动闭包作为参数
func serveClosure(customer customerProvider: <
print("Now Serving \(customerProvider())!")
}
serveClosure(customer: customersInLine.remove(at: 0) )
*/