蓝懿iOS 技术内容交流和学习心得 10.27

 正式开学第七天,今天又到了练习日,  那我们大家在一起复习一下这些内容:

控件:UILabel UITextField  UIImageView  UIButton

变量: int float double long longlong  char  short 

变量类型 变量名称 = 值;

运算符 + - * /  %  ++ —

计算器步骤:

1.搭建界面(一个文本输入框 一个Label  五个按钮)

2.在加减乘除运算符按钮的里面去把用户输入的数字用一个全局变量保存  并且用一个全局int类型的变量记录加减乘除 清空文本输入框

3.在等于按钮中 把用户输入的第二个数取出来用一个局部变量保存,判断之前保存的int值到底是加减还是乘除 做相对应的运算 得到结果 

4.把结果显示到label中

 运算符是检查、改变、合并值的特殊符号或短语。例如,加号+ 将两个数相加(如let i = 1 + 2 )。复杂些的运算例如逻辑与运算符&& (如if enteredDoorCode && passedRetinaScan ),或让 i 值加1的便捷自增运算符++i 等。  支持大部分标准 C 语言的运算符,且改进许多特性来减少常规编码错误。如:赋值符(= )不返回值,以防止把想要判断相等运算符(== )的地方写成赋值符导致的错误。数值运算符(+ ,- ,* ,/ ,% 等)会检测并不允许值溢出,以此来避免保存变量时由于变量大于或小于其类型所能承载的范围时导致的异常结果。当然允许你使用 Swift 的溢出运算符来实现溢出。详情参见溢出运算符。  区别于 C 语言,在 Swift 中你可以对浮点数进行取余运算(% ),Swift 还提供了 C 语言没有的表达两数之间的值的区间运算符,(a..b 和a…b ),这方便我们表达一个区间内的数值。  本章节只描述了 Swift 中的基本运算符,高级运算符包含了高级运算符,及如何自定义运算符,及如何进行自定义类型的运算符重载。  

术语

  运算符有一元、二元和三元运算符。  一元运算符对单一操作对象操作(如-a )。一元运算符分前置符和后置运算符,前置运算符需紧排操作对象之前(如!b ),后置运算符需紧跟操作对象之后(如i++ )。  二元运算符操作两个操作对象(如2 + 3 ),是中置的,因为它们出现在两个操作对象之间。  三元运算符操作三个操作对象,和 C 语言一样,Swift 只有一个三元运算符,就是三元条件运算符(a ? b : c )。  受运算符影响的值叫操作数,在表达式1 + 2 中,加号+ 是二元运算符,它的两个操作数是值1 和2 。  

赋值运算符

  赋值运算(a = b ),表示用b 的值来初始化或更新a 的值:

?

1

2

3

4

<code 

class

=

"hljs cs"

>let b = 

10

var a = 

5

a = b

// a 现在等于 10</code>

  如果赋值的右边是一个多元组,它的元素可以马上被分解多个变量或变量:

?

1

2

<code 

class

=

"hljs cs"

>let (x, y) = (

1

2

)

// 现在 x 等于 1, y 等于 2</code>

  与 C 语言和 Objective-C 不同,Swift 的赋值操作并不返回任何值。所以以下代码是错误的:

?

1

2

3

<code 

class

=

"hljs cs"

>

if

x = y {

    

// 此句错误, 因为 x = y 并不返回任何值

}</code>

  这个特性使你无法把(== )错写成(= ),由于if x = y 是错误代码,Swift 从底层帮你避免了这些错误代码。  

数值运算

  中所有数值类型都支持了基本的四则运算:  加法(+ )  减法(- )  乘法(* )  除法(/ )

?

1

2

3

4

<code 

class

=

"hljs cs"

>

1

2       // 等于 3

5

3       // 等于 2

2

3       // 等于 6

10.0

2.5  // 等于 4.0</code>

  与 C 语言和 Objective-C 不同的是,Swift 默认不允许在数值运算中出现溢出情况。但你可以使用 Swift 的溢出运算符来达到你有目的的溢出(如a &+ b )。详情参见溢出运算符。  加法运算符也可用于String 的拼接:

?

1

<code 

class

=

"hljs bash"

>

"hello, "

"world"  // 等于 "hello, world"</code>

  两个Character 值或一个String 和一个Character 值,相加会生成一个新的String 值:

?

1

2

3

4

5

<code 

class

=

"hljs cs"

>let dog: Character = 

"d"

let cow: Character = 

"c"

let dogCow = dog + cow

// 译者注: 原来的引号内是很可爱的小狗和小牛, 但win os下不支持表情字符, 所以改成了普通字符

// dogCow 现在是 "dc"</code>

  详情参见字符,字符串的拼接。  

求余运算

  求余运算(a % b )是计算b 的多少倍刚刚好可以容入a ,返回多出来的那部分(余数)。  注意:  求余运算(% )在其他语言也叫取模运算。然而严格说来,我们看该运算符对负数的操作结果,“求余”比“取模”更合适些。  我们来谈谈取余是怎么回事,计算9 % 4 ,你先计算出4 的多少倍会刚好可以容入9 中:

  2倍,非常好,那余数是1(用橙色标出)  在 Swift 中这么来表达:

?

1

<code 

class

=

"hljs cs"

>

9

4    // 等于 1</code>

  为了得到a % b 的结果,% 计算了以下等式,并输出余数 作为结果:  × 倍数) + 余数  当倍数 取最大值的时候,就会刚好可以容入a 中。  把9 和4 代入等式中,我们得1:

?

1

<code 

class

=

"hljs fix"

>

9

= (4 × 2) + 1</code>

  同样的方法,我来们计算 -9 % 4:

?

1

<code 

class

=

"hljs cs"

>-

9

4   // 等于 -1</code>

  把-9和4代入等式,-2是取到的最大整数:

?

1

<code 

class

=

"hljs fix"

>-

9

= (4 × -2) + -1</code>

  余数是-1 。  在对负数b 求余时,b 的符号会被忽略。这意味着a % b 和 a % -b 的结果是相同的。  浮点数求余计算  不同于 C 语言和 Objective-C,Swift 中是可以对浮点数进行求余的。

?

1

<code 

class

=

"hljs cs"

>

8

2.5 // 等于 0.5</code>

  这个例子中,8 除于2.5 等于3 余0.5 ,所以结果是一个Double 值0.5 。

自增和自增运算

  和 C 语言一样,Swift 也提供了方便对变量本身加1或减1的自增(++ )和自减(–)的运算符。其操作对象可以是整形和浮点型。

?

1

2

<code 

class

=

"hljs cs"

>var i = 

0

++i      

// 现在 i = 1</code>

  每调用一次++i ,i 的值就会加1。实际上,++i 是i = i + 1 的简写,而–i 是i = i - 1 的简写。  ++和– 既是前置又是后置运算。++i ,i++ ,–i 和i– 都是有效的写法。  我们需要注意的是这些运算符修改了i 后有一个返回值。如果你只想修改i的值,那你就可以忽略这个返回值。但如果你想使用返回值,你就需要留意前置和后置操作的返回值是不同的。  当++ 前置的时候,先自増再返回。  当++ 后置的时候,先返回再自增。  例如:

?

1

2

3

<code 

class

=

"hljs autohotkey"

>var a = 

0

let b = ++a 

//a和b现在都是 1

let c = a++ 

// a 现在 2, 但 c 是 a 自增前的值 1</code>

  上述例子,let b = ++a 先把a 加1了再返回a 的值。所以a 和b 都是新值1 。  而let c = a++ ,是先返回了a 的值,然后a 才加1。所以c得到了a 的旧值1,而a加1后变成2。  除非你需要使用i++ 的特性,不然推荐你使用++i 和 –i,因为先修改后返回这样的行为更符合我们的逻辑。 

一元负号

  数值的正负号可以使用前缀- (即一元负号)来切换:

?

1

2

3

<code 

class

=

"hljs lasso"

>let three = 

3

let minusThree = -three       

// minusThree 等于 -3

let plusThree = -minusThree   

// plusThree 等于 3, 或 "负负3"</code>

  一元负号(- )写在操作数之前,中间没有空格。  

一元正号

  一元正号(+ )不做任何改变地返回操作数的值。

?

1

2

<code 

class

=

"hljs cs"

>let minusSix = -

6

let alsoMinusSix = +minusSix  

// alsoMinusSix 等于 -6</code>

  虽然一元+ 做无用功,但当你在使用一元负号来表达负数时,你可以使用一元正号来表达正数,如此你的代码会具有对称美。  复合赋值(Compound Assignment Operators)  如同强大的 C 语言,Swift 也提供把其他运算符和赋值运算(= )组合的复合赋值运算符,加赋运算(+= )是其中一个例子:

?

1

2

<code 

class

=

"hljs livecodeserver"

>var a = 

1

a += 

2

// a 现在是 3</code>

  表达式a += 2 是a = a + 2 的简写,一个加赋运算就把加法和赋值两件事完成了。  注意:  复合赋值运算没有返回值,let b = a += 2 这类代码是错误。这不同于上面提到的自增和自减运算符。  在表达式章节里有复合运算符的完整列表。  

比较运算

  所有标准 C 语言中的比较运算都可以在 Swift 中使用。  等于(a == b )  不等于(a != b )  大于(a > b )  小于(a < b )  大于等于(a >= b )  小于等于(a <= b )  注意:  也提供恒等=== 和不恒等!== 这两个比较符来判断两个对象是否引用同一个对象实例。更多细节在类与结构。  每个比较运算都返回了一个标识表达式是否成立的布尔值:

?

1

2

3

4

5

6

<code 

class

=

"hljs bash"

>

1

== 1   // true, 因为 1 等于 1

2

!= 1   // true, 因为 2 不等于 1

2

1    // true, 因为 2 大于 1

1

2    // true, 因为 1 小于2

1

>= 1   // true, 因为 1 大于等于 1

2

<= 1   // false, 因为 2 并不小于等于 1</code>

  比较运算多用于条件语句,如if 条件:

?

1

2

3

4

5

6

7

<code 

class

=

"hljs autohotkey"

>let name = 

"world"

if

name == "world" {

    

println(

"hello, world"

)

else

{

    

println(

"I'm sorry \(name), but I don't recognize you"

)

}

// 输出 "hello, world", 因为 `name` 就是等于 "world"</code>

  关于if 语句,请看控制流。  

三元条件运算

  三元条件运算的特殊在于它是有三个操作数的运算符,它的原型是 问题 ? 答案1 : 答案2 。它简洁地表达根据问题 成立与否作出二选一的操作。如果问题 成立,返回答案1 的结果; 如果不成立,返回答案2 的结果。  使用三元条件运算简化了以下代码:

?

1

2

3

4

5

<code 

class

=

"hljs matlab"

>

if

question: {

  

answer1

else

{

  

answer2

}</code>

  这里有个计算表格行高的例子。如果有表头,那行高应比内容高度要高出50像素; 如果没有表头,只需高出20像素。

?

1

2

3

4

<code 

class

=

"hljs cs"

>let contentHeight = 

40

let hasHeader = 

true

let rowHeight = contentHeight + (hasHeader ? 

50

20)

// rowHeight 现在是 90</code>

  这样写会比下面的代码简洁:

?

1

2

3

4

5

6

7

8

9

<code 

class

=

"hljs cs"

>let contentHeight = 

40

let hasHeader = 

true

var rowHeight = contentHeight

if

hasHeader {

    

rowHeight = rowHeight + 

50

else

{

    

rowHeight = rowHeight + 

20

}

// rowHeight 现在是 90</code>

  第一段代码例子使用了三元条件运算,所以一行代码就能让我们得到正确答案。这比第二段代码简洁得多,无需将rowHeight 定义成变量,因为它的值无需在if 语句中改变。  三元条件运算提供有效率且便捷的方式来表达二选一的选择。需要注意的事,过度使用三元条件运算就会由简洁的代码变成难懂的代码。我们应避免在一个组合语句使用多个三元条件运算符。  

区间运算符

  提供了两个方便表达一个区间的值的运算符。  闭区间运算符

  闭区间运算符(a…b )定义一个包含从a 到b (包括a 和b )的所有值的区间。 ? 闭区间运算符在迭代一个区间的所有值时是非常有用的,如在for-in 循环中:

?

1

2

3

4

5

6

7

8

<code 

class

=

"hljs cs"

>

for

index in 1...5 {

    

println(

"\(index) * 5 = \(index * 5)"

)

}

// 1 * 5 = 5

// 2 * 5 = 10

// 3 * 5 = 15

// 4 * 5 = 20

// 5 * 5 = 25</code>

  关于for-in ,请看控制流。  半闭区间

  半闭区间(a..b )定义一个从a 到b 但不包括b的区间。 之所以称为半闭区间,是因为该区间包含第一个值而不包括最后的值。  半闭区间的实用性在于当你使用一个0始的列表(如数组)时,非常方便地从0数到列表的长度。

?

1

2

3

4

5

6

7

8

9

<code 

class

=

"hljs cs"

>let names = [

"Anna"

"Alex"

"Brian"

"Jack"

]

let count = names.count

for

i in 0..count {

    

println(

"第 \(i + 1) 个人叫 \(names[i])"

)

}

// 第 1 个人叫 Anna

// 第 2 个人叫 Alex

// 第 3 个人叫 Brian

// 第 4 个人叫 Jack</code>

  数组有4个元素,但0..count 只数到3(最后一个元素的下标),因为它是半闭区间。关于数组,请查阅数组。  

逻辑运算

  逻辑运算的操作对象是逻辑布尔值。Swift 支持基于 C 语言的三个标准逻辑运算。  逻辑非(!a )  逻辑与(a && b )  逻辑或(a || b )  逻辑非  逻辑非运算(!a )对一个布尔值取反,使得true 变false ,false 变true 。  它是一个前置运算符,需出现在操作数之前,且不加空格。读作非 a ,然后我们看以下例子:

?

1

2

3

4

5

<code 

class

=

"hljs bash"

>let allowedEntry = 

false

if

!allowedEntry {

    

println(

"ACCESS DENIED"

)

}

// 输出 "ACCESS DENIED"</code>

  if !allowedEntry语句可以读作 “如果 非 alowed entry。”,接下一行代码只有在如果 “非 allow entry” 为true ,即allowEntry 为false 时被执行。  在示例代码中,小心地选择布尔常量或变量有助于代码的可读性,并且避免使用双重逻辑非运算,或混乱的逻辑语句。  逻辑与

  逻辑与(a && b )表达了只有a 和b 的值都为true 时,整个表达式的值才会是true 。  只要任意一个值为false ,整个表达式的值就为false 。事实上,如果第一个值为false ,那么是不去计算第二个值的,因为它已经不可能影响整个表达式的结果了。这被称做 “短路计算(short-circuit evaluation)”。  以下例子,只有两个Bool值都为true 值的时候才允许进入:

?

1

2

3

4

5

6

7

8

<code 

class

=

"hljs bash"

>let enteredDoorCode = 

true

let passedRetinaScan = 

false

if

enteredDoorCode && passedRetinaScan {

    

println(

"Welcome!"

)

else

{

    

println(

"ACCESS DENIED"

)

}

// 输出 "ACCESS DENIED"</code>

  逻辑或

  逻辑或(a || b )是一个由两个连续的| 组成的中置运算符。它表示了两个逻辑表达式的其中一个为true ,整个表达式就为true 。  同逻辑与运算类似,逻辑或也是“短路计算”的,当左端的表达式为true时,将不计算右边的表达式了,因为它不可能改变整个表达式的值了。  以下示例代码中,第一个布尔值(hasDoorKey )为false ,但第二个值(knowsOverridePassword )为true ,所以整个表达是true ,于是允许进入:

?

1

2

3

4

5

6

7

8

<code 

class

=

"hljs bash"

>let hasDoorKey = 

false

let knowsOverridePassword = 

true

if

hasDoorKey || knowsOverridePassword {

    

println(

"Welcome!"

)

else

{

    

println(

"ACCESS DENIED"

)

}

// 输出 "Welcome!"</code>

  组合逻辑

  我们可以组合多个逻辑运算来表达一个复合逻辑:

?

1

2

3

4

5

6

<code 

class

=

"hljs go"

>

if

enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {

    

println(

"Welcome!"

)

else

{

    

println(

"ACCESS DENIED"

)

}

// 输出 "Welcome!"</code>

  这个例子使用了含多个&& 和|| 的复合逻辑。但无论怎样,&& 和|| 始终只能操作两个值。所以这实际是三个简单逻辑连续操作的结果。我们来解读一下:  如果我们输入了正确的密码并通过了视网膜扫描; 或者我们有一把有效的钥匙; 又或者我们知道紧急情况下重置的密码,我们就能把门打开进入。  前两种情况,我们都不满足,所以前两个简单逻辑的结果是false ,但是我们是知道紧急情况下重置的密码的,所以整个复杂表达式的值还是true 。  

使用括号来明确优先级

  为了一个复杂表达式更容易读懂,在合适的地方使用括号来明确优先级是很有效的,虽然它并非必要的。在上个关于门的权限的例子中,我们给第一个部分加个括号,使用它看起来逻辑更明确:

?

1

2

3

4

5

6

<code 

class

=

"hljs go"

>

if

(enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {

    

println(

"Welcome!"

)

else

{

    

println(

"ACCESS DENIED"

)

}

// 输出 "Welcome!"</code>

  这括号使得前两个值被看成整个逻辑表达中独立的一个部分。虽然有括号和没括号的输出结果是一样的,但对于读代码的人来说有括号的代码更清晰。可读性比简洁性更重要,请在可以让你代码变清晰地地方加个括号吧!

全局变量就是整个源程序都有效的变量;而局部变量会在其所属的函数

或循环等结束后消亡。整个程序都要用的变量定义全局变量,如果就是某个函数用的话,就定义局部变量,以便其他函数可以重新定义同名变量来使用。 要是都用全局变量,那遇到大程序时,程序是由不同人分别编各自的模块或函数,不能避免定义同名变量,到时就会冲突。?

 

BOOL变量:bool是布尔型变量,也就是逻辑型变量的定义符,类似于float,double

等,只不过float定义浮点型,double定义双精度浮点型。?

 

————————if判断——————————

 

1、第一种形式为基本形式:if

if(表达式) 语句

例如:

ain(){

?int a,b,max;

printf("\n input two numbers: ");

scanf("%d%d",&a,&b);

max=a;

if (max

printf("max=%d",max);

}

 

2、第二种形式为: if-else

if(表达式) 

语句1; 

else

 

3、第三种形式为if-else-if形式

前二种形式的if语句一般都用于两个分支的情况。当有多个分支选择时,可采用if-else-if语句,其一般形式为:

if(表达式1)

语句1;

else if(表达式2) 

语句2;

else if(表达式3) 

4.第四种形式为switch case break;

        switch (i%4) {

            case 0:

                l.backgroundColor = [UIColor yellowColor];

                break;

            case 1:

                l.backgroundColor = [UIColor blueColor];

                break;

            case 2:

                l.backgroundColor = [UIColor greenColor];

                break;

            default:

                l.backgroundColor = [UIColor redColor];

                break;

这种形式比前几种更快最主要它只能在整数时使用​

         for(表达式1;表达式2;表达式3) 语句

 

它的执行过程如下:

 先求解表达式1。

 求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行下面第3)步;若其值为假(0),则结束循环,转到第5)步。

 求解表达式3。

 转回上面第2)步继续执行。

 循环结束,执行for语句下面的一个语句。

 其执行过程可用下图表示。

 

for语句最简单的应用形式也是最容易理解的形式如下:

         for(循环变量赋初值;循环条件;循环变量增量) 语句

 循环变量赋初值总是一个赋值语句, 它用来给循环控制变量赋初值; 循环条件是一个关系表达式,它决定什么时候退出循环;循环变量增量,定义循环控制变量每循环一次后按什么方式变化。这三个部分之间用“;”分开。例如:

 for(i=1; i<=100; i++)sum=sum+i;

 

先给i赋初值1,判断i是否小于等于100, 若是则执行语句,之后值增加1。再重新判断, 直到条件为假,即i>100时,结束循环。相当于:

     i=1;

 while(i<=100)

     { sum=sum+i;

      i++;

 }

 

对于for循环中语句的一般形式,就是如下的while循环形式:

     表达式1;

 while(表达式2)

     {语句

      表达式3;

 }

 

使用for语句应该注意:

 for循环中的“表达式1(循环变量赋初值)”、“表达式2(循环条件)”和“表达式3(循环变量增量)”都是选择项, 即可以缺省,但“;”不能缺省。

省略了“表达式1(循环变量赋初值)”, 表示不对循环控制变量赋初值。

省略了“表达式2(循环条件)”, 则不做其它处理时便成为死循环。

 例如:

     for(i=1;;i++)sum=sum+i;

 相当于:

     i=1;

     while(1)

     {

          sum=sum+i;

          i++;

      }

 省略了“表达式3(循环变量增量)”, 则不对循环控制变量进行操作,这时可在语句体中加入修改循环控制变量的语句。

 例如:

 for(i=1;i<=100;)

 {sum=sum+i;

        i++;}

 省略了“表达式1(循环变量赋初值)”和“表达式3(循环变量增量)”。

 例如:

 for(;i<=100;)

 {sum=sum+i;

     i++;}

 相当于:

     while(i<=100)

         {sum=sum+i;

          i++;}

      -(返回值类型)方法名称参数介绍:(参数类型)参数名称and参数介绍:(参数类型)参数名称{

如果有返还就加retun

}​

内容总结:

1. 变量的作用域  局部变量 全局变量

2.BOOL  取值0或1   

3.if语句  else  else if

4.switchCase

5.按钮加tag

6.for循环  

7.NSTimer 

一、封装

封装是对象和类概念的主要特性。它是隐藏内部实现,稳定外部接口,可以看作是“包装”。封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

好处:使用更简单变量更安全可以隐藏内部实现细节开发速度加快

OC中一个类可以继承另一个类,被继承的类成为超类(superclass),继承的类是子类(childclass),可以直接拥有父类中所有非私有成员(相关实例变量)、方法。继承的实现在接口中使用符号“:”。

举个例子:@interfaceStudent:NSObject{}不过大家要注意的是:属性封装实例变量,方法封装具体实现代码,类封装属性和方法。子类可继承父类中的方法,还可重写父类方法。

二、多态

多态性(polymorphism)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。不同对象以自己的方式响应相同的消息的能力叫做多态。意思就是假设生物类(life)都用有一个相同的方法-eat;那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,但是调用是我们只需调用各自的eat方法。也就是不同的对象以自己的方式响应了相同的消息(响应了eat这个选择器)。

实现多态,有二种方式,覆盖,重载。

1)覆盖:是指子类重新定义父类的虚函数的做法。

2)重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。

三、继承

面向对象编程(OOP)语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是“属于”关系。例如,Employee是一个人,Manager也是一个人,因此这两个类都可以继承Person类。但是Leg类却不能继承Person类,因为腿并不是一个人。

本章小结:封装可隐藏实现细节,,使代码模块化;继承可扩展已存在的代码模块(类);它们最终需要的结果(代码重用)。多态是为了实现另一个目的(接口重用)。多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。

​第五天总结:

面向对象

属性

方法

初始化方法:有参和无参

类方法和对象方法(实例方法)

对象方法:-开头 通过创建出来的对象去调用的叫对象方法

类方法: 用+开头 通过类名去调用的方法叫类方法

工厂方法:用来创建对象的类方法 叫做工厂方法

单例:任何地方得到的对象都是同一个对象

封装

继承


​学习ios  重要还是要理清楚思路  在做或者看老师代码的时候 自己多想想为什么  不要自己看着就抄       另外还是要推荐一下 蓝懿IOS这个培训机构  和刘国斌老师刘国斌老师还是很有名气的,听朋友说刘老师成立了蓝懿iOS,,老师讲课方式很独特,能够尽量让每个人都能弄明白,有的比较难懂的地方,如果有的地方还是不懂得话,老师会换个其它方法再讲解,这对于我们这些学习iOS的同学是非常好的,多种方式的讲解会理解得更全面,这个必须得给个赞,嘻嘻,还有就是这里的学习环境很好,很安静,可以很安心的学习,安静的环境是学习的基础,小班讲课,每个班20几个学生,学习氛围非常好,每天都学到9点多才离开教室,练习的时间很充裕,而且如果在练习的过程中有什么困难,随时可以向老师求助,不像其它机构,通过视频教学,有的甚至学完之后都看不到讲师本人,问点问题都不方便,这就是蓝懿与其它机构的区别,相信在刘国斌老师的细心指导下,每个蓝懿学员都能找到满意的工作,加油!

​                                                                               写博客的第十七天,

                                                                      QQ 565803433

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值