7.4 控制转移语句

7.4 控制转移语句

支配转椅语句可以改变程序执行之一一。Swift 提供了季种植控制转移语句:

  • continue
  • break
  • fallthrough
  • return

本章介绍了前面三种话,而return并发于第八段函数吃。

Autolayout

  • 今日Autolayout已经很有力了,很多小卖部还在动这个效果,接下自己不怕来分别介绍几独Autolayout实现方式。
  • Autolayout的兑现有成千上万栽,苹果原API,之后的VFL,storyboard,第三正Masonry,每种抽出来都是一模一样首长文章,我会分开写,然后依次发表下,大家好选择好想使之办法来见到
  • 在此之前,我先行提出自本着Autolayout的下结论,这个总结将落实全文,帮助大家理解Autolayout的增长规律
    • Autolayout里有零星单词,约束参照
    • 如想展示一个控件,需要少独东西,位置尺寸
    • 丰富律不宜了多,当添加的羁绊好抒发该控件的位置尺寸,就够了
    • 约束就对控件的轻重要职务展开封锁,参照虽因为某个控件的职位展开约束,其实就二者没有明显的各自,它们都得针对控件的位置尺寸起至意向。
    • 有控件,都避开不起头位置尺寸,Autolayout就是将来波及这用之,所以自己背后的例证都归因于UIView为例

Continue

continue用于循环中,程序执行到continue常,会回来时巡回的极度开始。就接近continue会指向程序说:“当前底大循环已经截止就,进行下一样不行吧”。

注意
for循环中,增量语句一如既往会于实践。

下就段代码从字符串中剔除了颇具空格:

let puzzleInput = "great minds think alike"
var puzzleOutput = ""
for character in puzzleInput {
  if character == " " {
    continue
  }
  puzzleOutput += character
}
println(puzzleOutput)

要循环时底字符是空格,就见面进入if执行continue,此时次会跳了后面的puzzleOutput += character苟回到循环的启。

苹果代码实现Autolayout

  • 先被咱们初步修用Autolayout代码来成功一个控件的位置尺寸的设置吧
  • 自己只要于界面左下方放置一个宽高各为50的革命View,它离开左边缘与生边缘之区间都为20
  • 在此之前先介绍一个措施

/**
 *  这个是系统默认添加约束的方法,它是NSLayoutConstraint的类方法
 *
 *  @param view1      传入想要添加约束的控件
 *  @param attr1      传入想要添加约束的方向,这个枚举值有很多,可以自己看看
 *  @param relation   传入与约束值的关系,大于,等于还是小于
 *  @param view2      传入被参照对象
 *  @param attr2      传入被参照对象所被参照的方向,如顶部,左边,右边等等
 *  @param multiplier 传入想要的间距倍数关系
 *  @param c          传入最终的差值
 *
 *  @return NSLayoutConstraint对象
 */
+(instancetype)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c

//一部分NSLayoutAttribute枚举值
 NSLayoutAttributeLeft = 1,//控件左边
    NSLayoutAttributeRight,//控件右边
    NSLayoutAttributeTop,
    NSLayoutAttributeBottom,
    NSLayoutAttributeLeading,//控件左边
    NSLayoutAttributeTrailing,//控件右边
    NSLayoutAttributeWidth,//控件的宽
    NSLayoutAttributeHeight,//控件的高
    NSLayoutAttributeCenterX,//竖直方向中点
    NSLayoutAttributeCenterY,//水平方向中点
  • 以此方式的参数我好想用像的语言叙述下,但是要想不来,更多欲大家从底下的代码中传的参数去体会

//创建redView
UIView *redView = [[UIView alloc]init];
    redView.backgroundColor = [UIColor redColor];
    redView.translatesAutoresizingMaskIntoConstraints = NO;
    [self.view addSubview:redView];

//创建redView第一个约束,相对self.view的左边缘间距20
    NSLayoutConstraint * redLeftLc = [NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeLeftMargin relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1.0f constant:20.0];
//只有在没有参照控件的情况下,约束才加到自身,不然加到父控件上
    [self.view addConstraint:redLeftLc];
//创建redView第二个约束,相对self。view的底边缘间距20
    NSLayoutConstraint *redBottomLc = [NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottomMargin multiplier:1.0f constant:-20];//由于是redview相对self.view往上减20,所以是-20
//添加约束
    [self.view addConstraint:redBottomLc];
//创建redView第三个约束,设置自身宽,宽可以参照其他控件设置,比如是self.view宽的一半,则应该这样写
/*
[NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:0.5f constant:0.0];
*/
//这里直接设置自身宽为50
    NSLayoutConstraint * redWLc = [NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:kNilOptions multiplier:1.0f constant:50.0f];
//由于没有参照物,所以约束添加于自身身上
    [redView addConstraint:redWLc];
//创建最后一个约束,自身的高
    NSLayoutConstraint * redHLc = [NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:kNilOptions multiplier:1.0f constant:50];
//由于没有参照物,所以约束添加于自身身上
    [redView addConstraint:redHLc];

//这时请大家想一下,我只需要设置redView与self.view的位置关系,再确定自己的宽高,不就就完成了位置与尺寸这两个必须条件了么?

效果图1

  • 联网下我们继承添需求,在红方块的下手放一个相差她20区间,离self.view底部吗间距20,宽高相等的蓝色方块
  • 自家哪怕就此代码和注释来介绍者新方块怎么加吧

//先创建一个一个蓝色的view添加到视图上,剩下的就是用autolayout来设置它的“frame”了
UIView *blueView = [[UIView alloc]init];
    blueView.backgroundColor = [UIColor blueColor];
    blueView.translatesAutoresizingMaskIntoConstraints = NO;
    [self.view addSubview:blueView];
    self.blueView = blueView;
//创建第一个约束,左边间距,由于是想要与红色有20的间距,那么参照参数“toItem”就应该填redView
   NSLayoutConstraint *blueLeft = [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:redView attribute:NSLayoutAttributeRight multiplier:1.0f constant:20.0f];
   //与其他控件发生约束,所以约束添加到父控件上
    [self.view addConstraint:blueLeft];
//现在我们已经可以确定自己水平方向的位置了,还差垂直方向的位置,现在我们来创建第二个约束,参照物依然是红色方块,需求是要离self.view底部20间距,这不是正好和红色一样么,那么我们可以直接与红色方块底部对齐就行了
    NSLayoutConstraint *blueBottom = [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:redView attribute:NSLayoutAttributeBottom multiplier:1.0f constant:0.0f];//与红色方块底部对齐,倍数1.0f.差值0.0f
    //与其他控件发生约束,所以约束添加到父控件上
    [self.view addConstraint:blueBottom];
//剩下两个约束差不多,我就一并描述了,它们都以redView为参照,与其等宽等高
    NSLayoutConstraint *blueW = [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:redView attribute:NSLayoutAttributeWidth multiplier:1.0f constant:0.0f];
    [self.view addConstraint:blueW];

    NSLayoutConstraint *blueH = [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:redView attribute:NSLayoutAttributeHeight multiplier:1.0f constant:0.0f];
    [self.view addConstraint:blueH];
  • 搭下去省效果图
新添蓝色方块
  • 事实上Autolayout的盘算非常简单,刚起利用的时刻绝不想着就得,最好一个控件一个控件的贯彻依靠,分别满足该职务以及尺寸的需求,如果转几乎单控件一起为的话语,你得思路十分清楚,往往大家犯错是作在封锁添多矣,而休是补少了

  • 哪怕使上面的事例,很多丁会晤在装了和革命等高档宽后,还而失去上加顶部针对联合与底部对联合,这样高度就还设置了,他见面忽视了,上下以对同不仅予以了直位置,也与了高度,所以思路要清楚!

Break

break语句会直接退出整个控制流。break可据此当switch言或循环中。

autolayout动画

  • 末段咱们在原这事例上举行只小动画吧,让大家探听一下,autolayout是怎开动画的,哈哈
  • 要求:我用于蓝色方块的右边再加个同样大小的黄色方块,然后,要求点击屏幕,然后蓝色方块被移除,黄色方块替代蓝色方块的职位
  • 正是事例可以再次张嘴一个autolayout的知识点:优先级(priority)
  • 哼了,先添补加黄色方块吧

//一如往常,先创建黄色View
UIView *yellowV = [[UIView alloc]init];
    yellowV.backgroundColor = [UIColor yellowColor];
    yellowV.translatesAutoresizingMaskIntoConstraints = NO;
    [self.view addSubview:yellowV];
//开始创建约束,第一个约束是什么呢?一看就知道是左间距约束啦
    NSLayoutConstraint *yellowLeft = [NSLayoutConstraint constraintWithItem:yellowV attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:blueView attribute:NSLayoutAttributeRight multiplier:1.0f constant:20];
    //与其他控件发生约束,所以约束添加到父控件上
    [self.view addConstraint:yellowLeft];
//添加底部约束
    NSLayoutConstraint *yellowBottom = [NSLayoutConstraint constraintWithItem:yellowV attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1.0f constant:-20];
    //与其他控件发生约束,所以约束添加到父控件上
    [self.view addConstraint:yellowBottom];
//这里我直接设置宽高约束了,就省事不加参照控件了
    NSLayoutConstraint *yellowW = [NSLayoutConstraint constraintWithItem:yellowV attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:kNilOptions multiplier:1.0f constant:50.0f];
    [yellowV addConstraint:yellowW];

    NSLayoutConstraint *yellowH = [NSLayoutConstraint constraintWithItem:yellowV attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:kNilOptions multiplier:1.0f constant:50.0f];
    [yellowV addConstraint:yellowH];
  • 好,现在韵方块已经增长上去了
新添黄色方块
  • 紧接下自己重新黄色View添加一个绳,这个约束涉及到优先级,大家瞩目看代码了哈

//对黄色View添加约束,约束黄色view与红色View的间距为20
    NSLayoutConstraint *yellowAnotherLeft = [NSLayoutConstraint constraintWithItem:yellowV attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:redView attribute:NSLayoutAttributeRight multiplier:1.0f constant:20];
    UILayoutPriority priority = 250;//设置优先级
    yellowAnotherLeft.priority = priority;
    //与其他控件发生约束,所以约束添加到父控件上
    [self.view addConstraint:yellowAnotherLeft];
  • 或许大家该看到些端倪了,我当眼前都为黄色View添加了针对蓝色View间距位20的view,现在同时被黄色view对革命View添加一个间隔20底格,这很显然是无容许出现的景,黄色View怎么可能以做到及时点儿单约束为,用术语来说即使是约束冲突,但是大家留意看这段代码

UILayoutPriority priority = 250;//设置优先级
  • 我给yellowAnotherLeft这个约束添加了优先级,优先级的限定是0~1000,数字越充分,优先级更强,在匪设置的景象下默认为1000
  • 立刻证明了,我最终添加的这约束之先级是没有的,这个约束只有在她的撞约束为删掉后,它才会促成
  • 也就是说,我将蓝色view移除后,黄色View相对于蓝色View左间距20者约束就未立了,那么黄色view会自动的变成与红色View间距20
去除蓝色方块
  • 今大家了解优先级是啊状况了吧
  • 好了,让我们最终加几实行代码,来实现这个动画吧!

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//先把蓝色方块从父视图上移除
    [self.blueView removeFromSuperview];
//动画更新界面
    [UIView animateWithDuration:1.0f animations:^{
        [self.view layoutIfNeeded];
    }];
}
  • autolayout的动画片就是这么实现之,将操作代码走得了后,再让动画片块去创新界面,动画就下了

  • ok,动画就实现啊,由于我非会见来动画图片,所以没法放效果图上来,如果有会的读者,请务必赐教!我呢会失掉问话看身边的大神们

  • 今好不容易把Masonry写了了,花了森时刻,Storyboard版本的章我打算不更了,因为自看了写得甚好的storyboard实现Autolayout文章,看得自身无地自容啊~~

  • 不管怎样,希望大家能够管这知识点学好!

用来循环中

当程序执行到break的当儿,他会晤退出整个循环,而不是返回循环的开始。就仿佛对先后说:“所有循环已经终结,执行后的代码吧”。

VFL(Visual Format Language)实现Autolayout

用于switch

Swift
switch免容许情况的代码段也空,但是有时我们用般配某些情况,但是可未履行外代码,此时就算break的用武之地。
下的事例将不同样式数字转换成为整数品类:

let numberSymbol: Character = "三"  // Simplified Chinese for the number 3
var possibleIntegerValue: Int?
switch numberSymbol {
case "1", "١", "一", "๑":
    possibleIntegerValue = 1
case "2", "٢", "二", "๒":
    possibleIntegerValue = 2
case "3", "٣", "三", "๓":
    possibleIntegerValue = 3
case "4", "٤", "四", "๔":
    possibleIntegerValue = 4
default:
    break
}
if let integerValue = possibleIntegerValue {
    println("The integer value of \(numberSymbol) is \(integerValue).")
} else {
    println("An integer value could not be found for \(numberSymbol).")
}
Masonry实现Autolayout(推荐)

Fallthrough

当您用switch采取类 C 语言的过特性时,就要用到是关键字了。

let integerToDescribe = 5
var description = "The number \(integerToDescribe) is"
switch integerToDescribe {
case 2, 3, 5, 7, 11, 13, 17, 19:
    description += " a prime number, and also"
    fallthrough
default:
    description += " an integer."
}
println(description)

这事例中,我们因此了fallthrough根本字。我们怀念出口两种植字符串:"The number N is an integer"
或者
"The number N is a prime number, and also is an integer"。如果这数字不是2,3,5,7,11,13,17,19面临的一个,那么根据程序的流程,就见面取得第一种植字符串;如果他是里的一个,就会进来switch的首先遭遇状态,该情形会以description变为"The number N is a prime number, and also"。此时先后实施及了fallthrough,他会晤忽略下一个情景的极一旦实施该代表码段。在本例中,程序会跻身默认情况,在description后长" an integer"

注意
使用fallthrough后,switch匪会见还检测下一个情况的尺度,而是径直上该代码区域实施。通过fallthrough登的动静不克带有值绑定;同时既绑定的值当上的图景代码区域受到凡是不克应用的。

标签语句

我们可以于循环和switch遭逢嵌套循环和switch,当结构复杂的时刻,有时我们想continue外层的轮回或者想break某层的switch这便够呛不便利了。所以
Swift
引入了标签机制,来吗循环和switch起名,同时continuebreak后面可以以相应的讳,来便宜之控制次流程。
签语句是将标签的讳写在行首,后面紧跟一个冒号,之后是讲话,以while循环也条例:

LABEL_NAME: while 条件语句 {
  代码区域
}

下我们再打同样糟蛇形棋。我们只要再次变动一下条条框框:

  1. 玩耍开始经常,你把一个意味着你的塑小人放在1哀号格子左侧的桌面上,这是0号格子的职;
  2. 当且仅当您站于25哀号格子,你才胜利,否则执行后的手续;
  3. 本而掷骰子来获得一个[1,6]以内的数字;
  4. 汝挨棋盘上数字增大的取向前行该数字只格子,如果走过该数字之格子,你过了棋盘范围,那么回第2个步骤。例如你现在在0哀号格子,掷骰子的数字是6,那么即使发展6步,停于6如泣如诉格子上;如果现在在24号格子,就要再掷骰子了。
  5. 现在瞧时起没出楼梯,如果发生,就本着他爬至连年的格子;
  6. 更执行第2步。

咱因此 Swift 来打这娱乐:

let finalSquare = 25
var board = Int[](count: finalSquare + 1, repeatedValue: 0)
board[3] = 8
board[6] = 11
board[9] = 9
board[10] = 2
board[14] = -10
board[19] = -11
board[22] = -2
board[24] = -9

var square = 0
var turns = -1

gameLoop: while square != finalSquare {
    ++turns
    var diceRoll = turns % 6 + 1
    switch square + diceRoll {
    case finalSquare:
        // diceRoll will move us to the final square, so the game is over
        break gameLoop
    case let newSquare where newSquare > finalSquare:
        // diceRoll will move us beyond the final square, so roll again
        continue gameLoop
    default:
        // this is a valid move, so find out its effect
        square += diceRoll
        square += board[square]
    }
}
println("You win after \(turns + 1) turns")

及时段代码中我们汇总采取了while循环,switch的值绑定以及where子句。我们把turns设置为-1,在循环开始时进行自增,这样保证continue之后,turns`否会见大增1。但是很丧气的凡,在这种规则下,我们放的阶梯会令你的塑料假人永远也移步不至顶点,她见面疲劳在即时长长的蛇身上。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图