Swift快速入门(四)流程控制
相关文章Swift快速入门系列
1.分支结构Swift提供两种常见的分支控制结构:if语句和swich语句。一般来说,当条件简单且可能情况较少时使用if语句;当条件比较复杂情况较多时则可以考虑使用swich语句。
if条件语句if语句有三种形式第一种:
if expression{ statements...}
第二种:
if expression{ statements...}else{ statements...}
第三种
if expression{ statements...}else if expression{ statements...}else{ statements...}
简单举个例子:
var age = 30if age > 20{ print("年龄大于20岁")}else{ print("年龄小于等于20岁")}
switch分支语句s ...
Swift快速入门(三)运算符
相关文章Swift快速入门系列
1.赋值运算符赋值运算(a = b),表示用b的值来初始化或更新a的值:
var b = 10var a = 5a = b // a 现在等于 10
Swift 的赋值语句没有返回值,所以以下代码是错误的:
// 此句错误, 因为 x = y 并不返回任何值if x = y { }
2.算术运算符Swift 让所有数值类型都支持了基本的四则运算:加法(+)减法(-)乘法(*)除法(/)
var a=1 + 2 // 等于 3var b=5 - 3 // 等于 2var c=2 * 3 // 等于 6var d=10.0 / 2.5 // 等于 4.0
3.溢出运算符Swift不允许整型变量或者常量被赋值一个超出其表数范围的数值,如果试图这么干,则会出现运行时错误:
var a:Int16=32767//a+1的值超出了Int16的表数范围,则下面的代码会导致错误a=a+1
如果希望数据溢出时Swift程序只是对一出的数据位进行截断而不是导致错误,则可以使用以&开头的溢出运算符:
溢 ...
Swift快速入门(二)基本数据类型
相关文章Swift快速入门系列
1.变量和常量声明常量和变量Swfit是强类型的语言,Swift要求所有的变量和常量必须先声明后使用。声明变量需要使用var,声明常量则需要使用let
var 变量名[:类型] =初始值let 常量名[:类型] =初始值
下面来进行举例:
// 声明变量时显式指定类型var age : Int// 声明变量时指定初始值,编译器会根据初始值确定该变量的类型为Stringvar game= "九阴真经"// 显式指定的类型与初始值的类型一致,声明变量正确var age1: Int = 30;// 显式指定的类型与初始值的类型不一致,声明变量失败var game1 : String = 500;// 定义常量,没有显式指定类型,编译器根据初始值确定常量的类型let maxAge = 120// 定义常量时,既显式指定常量的类型,也指定常量的初始值let game2: String = "九阴真经"
输出常量和变量可以用print函数来输出当前常量或变量的值:
print(game) //九阴真经
Swift 用字符串 ...
Android IPC机制(四)用ContentProvider进行进程间通信
本文首发于微信公众号「后厂技术官」
前言ContentProvider为存储和获取数据提供统一的接口,它可以在不同的应用程序之间共享数据,本身就是适合进程间通信的。ContentProvider底层实现也是Binder,但是使用起来比AIDL要容易许多。系统也预制了很多的ContentProvider,例如通讯录,音视频等,这些操作本身就是跨进程进行通信。这篇文章主要是我们来自己实现用ContentProvider来进行进程间通信,而非介绍ContentProvider怎么使用。
1. 建立数据库,方便ContentProvider使用我们创建数据库,并创建表”game_provider.db”,里面有两个字段分别存储游戏的名字和游戏的描述。(DbOpenHelper.java)
package com.example.liuwangshu.mooncontentprovider;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database. ...
关于App程序员泡沫
前言做开发快七年了,对于程序员,外行人总有着数不完的讽刺和误解,但是我都懒得去解释,代码搬运工人也好,民工也罢,随他们去说吧。但是网上最近流传的程序员泡沫,尤其是APP程序员泡沫的文章导致很多我们的年轻的同行产生了疑惑,所以我这个隐藏了很久的能言善辩的老程序员出山来聊一聊这个APP程序员泡沫的话题。笔者是2010年从事安卓开发,此前做J2ee,对于安卓我有很深的感情,此前也是有意学了iOS,但是还是决定在安卓这条路上一直走到黑,在2010年一个好的安卓开发苗子工资可以过万,工作经验也就1年那样子,基本上你会点安卓都可以接近1W。想想最近某些文章中提到现在安卓开发新手动不动就要过万的工资相比,我觉得现在的新手做法并不为过:第一,以现在的北京物价房价对比2010年来说,开发的工资其实并没有涨反倒是跌了。第二,现在的开发比2010年的新手安卓开发要厉害一些,那个时候网上资料很少,书也很少,大多数安卓开发自学起来很痛苦。现在网上资料多,也有很多高水品的技术书,也有很完善的培训机制。当然现在很多APP开发存在漫天要价的现象,但是作为企业的HR,技术经理甚至老板你可以选择不要他啊。这篇文章只讨论 ...
Swift快速入门(一)第一个Swift程序
相关文章Swift快速入门系列
1. 本系列说明本系列只是一个Swift快速入门的教程,并没有详尽的介绍Swift,Swift也并不是一个简单的编程语言,所以要想详尽的系统的学习Swift,本系列并不适合你,此系列只是让开发者可以快速的用Swift来进行开发。另外学习本系列并不需要obj-c的知识,但是如果你想开发iOS,obj-c是必须要学的,因为Swift并不能很快的替代obj-c。另外本系列基于OS X EI Captitan 10.11.2,Xcode7.2。
2. Swift介绍Swift,苹果于2014年WWDC(苹果开发者大会)发布的新开发语言,可与Objective-C共同运行于Mac OS和iOS平台,用于搭建基于苹果平台的应用程序。Swift吸收了众多现代编程语言的优点,尽力的提供简洁的编程语言和强大的功能。
3. 第一个Swift程序Swift源文件的第一行可执行的代码就是Swift的程序的入口:
print("Hello World")
Swift程序的执行语句可以无须任何符号作为结束,Swift把每行代码作为了一个语句。但是如果在一行写了多 ...
设计模式(二)单例模式的七种写法
本文首发于微信公众号「后厂技术官」
相关文章设计模式系列
面试的时候,问到许多年轻的Android开发他所会的设计模式是什么,基本上都会提到单例模式,但是对单例模式也是一知半解,在Android开发中我们经常会运用单例模式,所以我们还是要更了解单例模式才对。
定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
单例模式结构图:
单例模式有多种写法各有利弊,现在我们来看看各种模式写法。
1. 饿汉模式public class Singleton { private static Singleton instance = new Singleton(); private Singleton (){ } public static Singleton getInstance() { return instance; } }
这种方式在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快。 这种方式基于类加载机制避免了多线程的同步问题,但是也不 ...
Android Design Support Library(三)用CoordinatorLayout实现Toolbar隐藏和折叠
本文首发于微信公众号「后厂技术官」
此文的代码在 Android Design Support Library(一)用TabLayout实现类似网易选项卡动态滑动效果代码的基础上进行修改,如果你没有看过本系列的第一篇文章最好先看一看。CoordinatorLayout是Android Design Support Library中比较难的控件,顾名思义,它是用来组织它的子views之间协作的一个父view。CoordinatorLayout默认情况下可理解是一个FrameLayout,它的布局方式默认是一层一层叠上去,在这里我会介绍一下它最常用的两种情况。
1. CoordinatorLayout实现Toolbar隐藏效果 先来看看效果
接下来代码实现,首先仍旧是配置build.gradle:
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:22 ...
设计模式(一)设计六大原则
本文首发于微信公众号「后厂技术官」
相关文章设计模式系列
1. 单一职责原则(SRP)定义:就一个类而言,应该仅有一个引起它变化的原因。 从这句定义我们很难理解它的含义,通俗讲就是我们不要让一个类承担过多的职责。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到破坏。 比如我经常看到一些Android开发在Activity中写Bean文件,网络数据处理,如果有列表的话Adapter 也写在Activity中,问他们为什么除了好找也没啥理由了,把他们拆分到其他类岂不是更好找,如果Activity过于臃肿行数过多,显然不是好事,如果我们要修改Bean文件,网络处理和Adapter都需要上这个Activity来修改,就会导致引起这个Activity变化的原因太多,我们在版本维护时也会比较头疼。也就严重违背了定义“就一个类而言,应该仅有一个引起它变化的原因”。 当然如果想争论的话,这个模式是可以引起很多争论的,但请记住一点,你写代码不只是为了你也 ...
Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用
本文首发于微信公众号「后厂技术官」
在上一篇文章Android IPC机制(二)用Messenger进行进程间通信中我们介绍了使用Messenger来进行进程间通信的方法,但是我们能发现Messenger是以串行的方式来处理客户端发来的信息,如果有大量的消息发到服务端,服务端仍然一个一个的处理再响应客户端显然是不合适的。另外,Messenger用来进程间进行数据传递但是却不能满足跨进程的方法调用,接下来我们来使用AIDL来实现跨进程方法调用,此前我们都是用Eclipse来实现的,这次我们看看在Android Studio中使用AIDL有什么不同。
1. 创建AIDL文件 我们将项目的目录结构调为Android模式,在java同级目录创建aidl文件夹,在文件夹中创建一个包名和应用包名一致的包
我们先创建一个IGameManager.aidl的文件,这里面有两个方法分别是addGame和getGameList。(IGameManager.aidl)
package com.example.liuwangshu.moonaidl;import com.example.liuwan ...
Android IPC机制(二)用Messenger进行进程间通信
本文首发于微信公众号「后厂技术官」
本来想写Binder的,笔者很多年前研究Android Native Framework时才了解到的,实话说对应用层的开发帮助不大,网上文章也比较多,如果想了解可以参考Android Bander设计与实现 - 设计篇这篇文章。另外在看这篇文章前最好看一下本文章的前篇Android IPC机制(一)开启多进程。
Messenger可以在不同进程中传递Message对象,我们在Message中加入我们想要传的数据就可以在进程间的进行数据传递了。Messenger是一种轻量级的IPC方案并对AIDL 进行了封装,它实现起来比较容易,下面我们来看看如何实现。
首先我们先写服务端(MessengerService.java),在onBind方法中创建Messenger,关联接收消息的Handler调用getBinder来获取Binder对象,在handleMessage方法中接收客户端发来的信息。
import android.app.Service;import android.content.Intent;import android.os.H ...
Android IPC机制(一)开启多进程
本文首发于微信公众号「后厂技术官」
1. 为何要开启多进程为何开启android应用要开启多进程,主要有以下几点:
单进程所分配的内存不够,需要更多的内存。在早期android系统只为一个单进程的应用分配了16M的可用内存,随着手机的硬件的提升和android系统的改进,虽然可分配内存越来越多,但仍旧可以通过开启多进程来获取更多的内存来处理自己App的业务
独立运行的组件,比如个推,它的服务会另开一个进程。
运行一些”不可见人”的操作,比如获取用户的隐私数据,比如双守护进程来防止被用户杀掉
2. 开启多进程首先我们写一个Activity并启动一个service
public class MyProcessActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layou ...
Android Design Support Library(二)用NavigationView实现抽屉菜单界面
本文首发于微信公众号「后厂技术官」
NavigationView在MD设计中非常重要,之前Google也提出了使用DrawerLayout来实现导航抽屉。这次,在Android Design Support Library中,Google提供了NavigationView来实现导航菜单界面。
这次我们写的代码在Android用TabLayout实现类似网易选项卡动态滑动效果这篇文章代码的基础上进行修改,所以最好先看看上面这篇文章
首先仍旧是配置build.gradle:
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:22.2.0' compile 'com.android.support:design:22.2.0' compile 'com.android.support:recycler ...
Android Design Support Library(一)用TabLayout实现类似网易选项卡动态滑动效果
本文首发于微信公众号「后厂技术官」
此前我们用HorizontalScrollView也实现了类似网易选项卡动态滑动效果,详见 Android选项卡动态滑动效果这篇文章
这里我们用TabLayout来实现这一效果。TabLayout是Android Design Support Library库中的控件。Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来了全新的Android Design Support Library,在这个support库里面,Google给我们提供了更加规范的MD设计风格的控件。最重要的是,Android Design Support Library的兼容性更广,直接可以向下兼容到Android 2.2。
首先我们先来看看效果:
接下来开始实现
1. 配置build.gradle在build.gradle加入如下代码
dependencies { compile fileTree(dir: 'libs', include: ['*.jar ...
Java并发编程(二)同步
如果你的java基础较弱,或者不大了解java多线程请先看这篇文章java多线程(一)线程定义、状态和属性
同步一直是java多线程的难点,在我们做android开发时也很少应用,但这并不是我们不熟悉同步的理由。希望这篇文章能使更多的人能够了解并且应用java的同步。在多线程的应用中,两个或者两个以上的线程需要共享对同一个数据的存取。如果两个线程存取相同的对象,并且每一个线程都调用了修改该对象的方法,这种情况通常成为竞争条件。竞争条件最容易理解的例子就是:比如火车卖票,火车票是一定的,但卖火车票的窗口到处都有,每个窗口就相当于一个线程,这么多的线程共用所有的火车票这个资源。并且无法保证其原子性,如果在一个时间点上,两个线程同时使用这个资源,那他们取出的火车票是一样的(座位号一样),这样就会给乘客造成麻烦。解决方法为,当一个线程要使用火车票这个资源时,我们就交给它一把锁,等它把事情做完后在把锁给另一个要用这个资源的线程。这样就不会出现上述情况。
1. 锁对象synchronized关键字自动提供了锁以及相关的条件,大多数需要显式锁的情况使用synchronized非常的方便,但是等我 ...
Android5.x Toolbar和Palette应用解析
本文首发于微信公众号「后厂村码农」
对于已经被不大好用的Actionbar折磨的开发者来说,Toolbar的出现确实是一个好消息,Toolbar是应用的内容的标准工具栏,可以说是Actionbar的升级版,两者不是独立关系,要使用Toolbar还是得跟ActionBar有关系的。相比Actionbar Toolbar最明显的一点就是变得很自由,可随处放置,具体的使用方法和Actionbar很类似。
1. 引入Toolbar由于用的android studio ,我们首先还是要引入V7支持包,在build.gradle配置如下代码
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.0.1' compile 'com.android ...