August 1, 2014
rabbitmq 添加远程访问功能
"\u003cp\u003e刚刚安装过的rabbitmq 消息队列,并启用了插件管理功能,3.3.1版中,处于安全的考虑,guest这个默认的用户只能通过http://localhost:15672 来登录,其他的IP无法直接使用这个账号。 这对于服务器上没有安装桌面的情况是无法管理维护的,除非通过在前面添加一层代理向外提供服务,这个又有些麻烦了,这里通过配置文件来实现这个功能。\u003c/p\u003e\n\u003cp\u003e只要编辑 /etc/rabbitmq/rabbitmq.config 文件,添加以下配置就可以了。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[\n{rabbit, [{tcp_listeners, [5672]}, {loopback_users, [“asdf”]}]}\n].\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e现在添加了一个新授权用户asdf,可以通过外网使用这个用户名和密码访问.(记得要先用命令添加这个命令才行,#rabbitmqctl add_user asdf pwd123456)我是通过在管理平台里直接添加的用户和密码的,我的测试环境装有桌面的。\n参考文档: \u003ca href=\"http://www.rabbitmq.com/access-control.html\"\u003ehttp://www.rabbitmq.com/access-control.html\u003c/a\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# rabbitmqctl add_user …\u003c/code\u003e\u003c/pre\u003e"
August 1, 2014
【架构】关于RabbitMQ
"\u003ch1 id=\"1什么是rabbitmq\"\u003e1 什么是RabbitMQ?\u003c/h1\u003e\n\u003cp\u003eRabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然:\n\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2014/08/rabbitmq_decouping.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/rabbitmq_decouping.png\" alt=\"rabbitmq_decouping\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e单向解耦\n双向解耦(如:RPC)\u003c/p\u003e\n\u003cp\u003e例如一个日志系统,很容易使用RabbitMQ简化工作量,一个Consumer可以进行消息的正常处理,另一个Consumer负责对消息进行日志记录,只要在程序中指定两个Consumer所监听的queue以相同的方式绑定到同一个exchange即可,剩下的消息分发工作由RabbitMQ完成。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2014/08/rabbitmq_producer_consumer.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/rabbitmq_producer_consumer.png\" alt=\"rabbitmq_producer_consumer\"\u003e\u003c/a\u003e\n使用RabbitMQ server需要:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eErLang语言包;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRabbitMQ安装包;\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eRabbitMQ同时提供了java的客户端(一个jar包)。\u003c/p\u003e\n\u003ch1 id=\"2概念和特性\"\u003e2 概念和特性\u003c/h1\u003e\n\u003ch2 id=\"21交换机exchange\"\u003e2.1 交换机(exchange):\u003c/h2\u003e\n\u003cp\u003e1. 接收消息,转发消息到绑定的队列。四种类型:direct, topic, headers and fanout\u003c/p\u003e\n\u003cp\u003edirect:转发消息 …\u003c/p\u003e"
July 28, 2014
mysql中数据类型的长度解释
"\u003ch2 id=\"112-数值类型\"\u003e11.2. 数值类型\u003c/h2\u003e\n\u003cp\u003eMySQL支持所有标准SQL数值数据类型。这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。\u003c/p\u003e\n\u003cp\u003eBIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。\u003c/p\u003e\n\u003cp\u003e作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。\u003c/p\u003e\n\u003ctable\u003e\n \u003cthead\u003e\n \u003ctr\u003e\n \u003cth\u003e\u003cstrong\u003e类型\u003c/strong\u003e\u003c/th\u003e\n \u003cth\u003e\u003cstrong\u003e字节\u003c/strong\u003e\u003c/th\u003e\n \u003cth\u003e\u003cstrong\u003e最小值\u003c/strong\u003e\u003c/th\u003e\n \u003cth\u003e\u003cstrong\u003e最大值\u003c/strong\u003e\u003c/th\u003e\n \u003c/tr\u003e\n \u003c/thead\u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\u003e\u003c/td\u003e\n \u003ctd\u003e\u003c/td\u003e\n \u003ctd\u003e\u003cstrong\u003e(带符号的/无符号的)\u003c/strong\u003e\u003c/td\u003e\n \u003ctd\u003e\u003cstrong\u003e(带符号的/无符号的)\u003c/strong\u003e\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\u003eTINYINT\u003c/td\u003e\n \u003ctd\u003e1\u003c/td\u003e\n \u003ctd\u003e-128\u003c/td\u003e\n \u003ctd\u003e127 …\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e"
July 23, 2014
MySQL 更新并返回计数
"\u003cp\u003e对于想使用 MySQL 实现简单 ID 分配器, 一般就是设置一个整数字段, 然后想分配的时候加 1 并返回. 新手往往犯错误, 先执行一条 update 语句, 然后再 select 那个字段. 但这是错误的!\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-sql\" data-lang=\"sql\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eCREATE\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eTABLE\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e`\u003c/span\u003emytable\u003cspan style=\"color:#f92672\"\u003e`\u003c/span\u003e (\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003e`\u003c/span\u003ecounter\u003cspan style=\"color:#f92672\"\u003e`\u003c/span\u003e int(\u003cspan style=\"color:#ae81ff\"\u003e10\u003c/span\u003e) \u003cspan style=\"color:#66d9ef\"\u003eNOT\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eNULL\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eDEFAULT\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;0\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e) ENGINE\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003eInnoDB \u003cspan style=\"color:#66d9ef\"\u003eDEFAULT\u003c/span\u003e CHARSET\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003eutf8;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003einsert\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003einto\u003c/span\u003e mytable \u003cspan style=\"color:#66d9ef\"\u003evalues\u003c/span\u003e(\u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e正确的方式应该是使用 last_insert_id() 函数:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-sql\" data-lang=\"sql\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eupdate\u003c/span\u003e mytable \u003cspan style=\"color:#66d9ef\"\u003eset\u003c/span\u003e counter\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003elast_insert_id(counter\u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eselect\u003c/span\u003e last_insert_id();\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e另一种方法(http://imysql.cn/2010/07/01/mysql-faq-using-mysql-as-serial-generator.html):\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-sql\" data-lang=\"sql\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eSELECT\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e`\u003c/span\u003eID\u003cspan style=\"color:#f92672\"\u003e`\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eFROM\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e`\u003c/span\u003eID_RANGE_XX\u003cspan style=\"color:#f92672\"\u003e`\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eORDER\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eBY\u003c/span\u003e ID \u003cspan style=\"color:#66d9ef\"\u003eLIMIT\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eFOR …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
June 20, 2014
golint—golang代码质量检测
"\u003cp\u003egithub: \u003ca href=\"https://github.com/golang/lint\"\u003ehttps://github.com/golang/lint\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003egolint是类似javascript中的jslint的工具,主要功能就是检测代码中不规范的地方。golint用于检测go代码。\u003c/p\u003e\n\u003ch2 id=\"使用\"\u003e使用\u003c/h2\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ go get github.com/golang/lint\n$ go install github.com/golang/lint\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003egolint 文件名或者目录\u003c/code\u003e\n检测对应的代码。\u003c/p\u003e\n\u003cp\u003egolint会输出一些代码存在的问题:\n比如:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003erecorder.go:55:5: exported var RecordBind should have comment or be unexported\nrecorder.go:158:1: exported function Record_ErrorRecord should have comment or be unexported\nrecorder.go:173:6: don\u0026#39;t use underscores in Go names; type Data_MemStats should be DataMemStats …\u003c/code\u003e\u003c/pre\u003e"
June 19, 2014
Swift中的标准函数
"\u003cp\u003eSwift中共有74个内建函数,但是在Swift官方文档(“ \u003ca href=\"https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/index.html#//apple_ref/doc/uid/TP40014097\"\u003eThe Swift Programming Language\u003c/a\u003e”)中只记录了7中。剩下的67个都没有记录。\u003c/p\u003e\n\u003cp\u003e本文将列举Swift所有的内建函数。本文中提到的所谓的内建函数是指那些在Swift中不需要导入任何模块(如Foundation等)或者引用任何类就可以使用的函数。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eabs(signedNumber)\u003c/strong\u003e: 返回给定的有符号数字的绝对值。很简单,但是没有在文档中记录。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eabs(-1) == 1\u003c/li\u003e\n\u003cli\u003eabs(-42) == 42\u003c/li\u003e\n\u003cli\u003eabs(42) == 42\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003econtains(sequence, element)\u003c/strong\u003e: 如果给定的序列(如数组)包含特定的元素,则返回true。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003evar languages = [“Swift”, “Objective-C”]\u003c/li\u003e\n\u003cli\u003econtains(languages, “Swift”) == true\u003c/li\u003e\n\u003cli\u003econtains(languages, “Java”) == false\u003c/li\u003e\n\u003cli\u003econtains([29, 85, 42, 96, 75], 42) == true\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003edropFirst(sequence)\u003c/strong\u003e: 返 …\u003c/p\u003e"
June 17, 2014
进程管理工具Supervisord
"\u003ch2 id=\"supervisord-简介\"\u003eSupervisord 简介\u003c/h2\u003e\n\u003cp\u003e上面已经介绍了Go目前是有两种方案来实现他的daemon,但是官方本身还不支持这一块,所以还是建议大家采用第三方成熟工具来管理我们的应用程序,这里我给大家介绍一款目前使用比较广泛的进程管理软件: \u003ca href=\"http://supervisord.org/\"\u003eSupervisord\u003c/a\u003e。Supervisord是用Python实现的一款非常实用的进程管理工具。supervisord会帮你把管理的应用程序转成daemon程序,而且可以方便的通过命令开启、关闭、重启等操作,而且它管理的进程一旦崩溃会自动重启,这样就可以保证程序执行中断后的情况下有自我修复的功能。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e我前面在应用中踩过一个坑,就是因为所有的应用程序都是由Supervisord父进程生出来的,那么当你修改了操作系统的文件描述符之后,别忘记重启Supervisord,光重启下面的应用程序没用。当初我就是系统安装好之后就先装了Supervisord,然后开始部署程序,修改文件描述符,重启程序,以为文件描述符已经是100000了,其实Supervisord这个时候还是默认的1024个,导致他管理的进程所有的描述符也是1024.开放之后压力一上来系统就开始报文件描述符用光 …\u003c/p\u003e\u003c/blockquote\u003e"
June 17, 2014
京东网站url规划分析
"\u003cp\u003e对于一些大型产品网站,当不同产品项的过滤条件不一样的时候,多个过滤条件会完全不一样。如服装行业与电脑配置的许多参数都不一样。而他们又是如何实现自动通过程序来调用的呢,是一个很值得学习的知识的。\u003c/p\u003e\n\u003cp\u003e下面我们来通过京东其中一个服装url来看一下,他们是如何实现这一点的。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2014/06/jd_url_parse1.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/jd_url_parse1.png\" alt=\"jd_url_parse1\"\u003e\u003c/a\u003e上图是对于一些大类频道的url规划信息。非常的清楚,就不再一一讲述了。下面我们主要讲右侧”条件筛选“这一块.\u003c/p\u003e\n\u003cp\u003e分析url:\n\u003ca href=\"http://list.jd.com/list.html?cat=1315%2C1342%2C9733\u0026amp;brand=35553%2Ctzmall\u0026amp;page=1\u0026amp;ext=53345%3A%3A1373%5E%5E64135%3A%3A8646%5E%5E95400%3A%3A8648%5E%5E10669%3A%3A1656%5E%5E29520%3A%3A1589%5E%5E110357%3A%3A10991%5E%5E\u0026amp;delivery=2\u0026amp;sort=sort_dredisprice_asc\"\u003ehttp://list.jd.com/list.html?cat=1315%2C1342%2C9733\u0026amp;brand=35553%2Ctzmall\u0026amp;page=1\u0026amp;ext=53345%3A%3A1373%5E%5E64135%3A%3A8646%5E%5E95400%3A%3A8648%5E%5E10669%3A%3A1656%5E%5E29520%3A%3A1589%5E%5E110357%3A%3A10991%5E%5E\u0026amp;delivery=2\u0026amp;sort=sort_dredisprice_asc\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e经过用js的unescape(url)反编码后,得出url …\u003c/p\u003e"
June 16, 2014
iOS的主要框架介绍(转)
"\u003cp\u003e框架是一个目录,这个目录包含了共享库,访问共享库里代码的头文件,和其它的图片和声音的资源文件。一个共享库定义的方法或函数可以被应用程序调用。\u003c/p\u003e\n\u003cp\u003eIOS提供了很多你可以在应用程序里调用的框架。要使用一个框架,需要将它添加到你的项目中,你的项目才可以使用它。许多应用程序都使用了如Foundation、UIKit、和Core Graphics这些框架。根据你为应用程序选择的模版,相关的框架就已经被自动引入了。如果默认加入的框架不能满足你的应用程序的需求,你也可以加入需要的框架。\u003c/p\u003e\n\u003cp\u003e看看HelloWorld.xcodeproj项目里都包含了哪些框架(注:HelloWorld.xcodeproj是《\u003cem\u003eYour First iOS App\u003c/em\u003e tutorial 》这篇教程里的一个项目)\u003c/p\u003e\n\u003cp\u003e1.在XCode里打开HelloWorld.xcodeproj项目(如果还没有打开)\u003c/p\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003e在project navigator窗口里点击,点击Frameworks目录前面的三角形图标。你会看到:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eUIKit.framework,Foundation.framework, 和CoreGraphics.framework\u003c/p\u003e\n\u003col start=\"3\"\u003e\n\u003cli\u003e点击 …\u003c/li\u003e\u003c/ol\u003e"
June 15, 2014
Swift中的柯里化函数
"\u003cp\u003e柯里化函数(curried function)的类型相当于一个嵌套函数类型。例如,下面的柯里化函数 \u003ccode\u003eaddTwoNumber()()\u003c/code\u003e 的类型是 \u003ccode\u003eInt -\u0026gt; Int -\u0026gt; Int\u003c/code\u003e:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-lang-swift\" data-lang=\"lang-swift\"\u003efunc addTwoNumbers(a: Int)(b: Int) -\u0026gt; Int{\n return a + b\n}\naddTwoNumbers(4)(5) // returns 9\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e柯里化函数的函数类型从右向左组成一组。例如,函数类型 \u003ccode\u003eInt -\u0026gt; Int -\u0026gt; Int\u003c/code\u003e 可以被理解为 \u003ccode\u003eInt -\u0026gt; (Int -\u0026gt; Int)\u003c/code\u003e——也就是说,一个函数传入一个 \u003ccode\u003eInt\u003c/code\u003e 然后输出作为另一个函数的输入,然后又返回一个 \u003ccode\u003eInt\u003c/code\u003e。例如,你可以使用如下嵌套函数来重写柯里化函数 \u003ccode\u003eaddTwoNumbers()()\u003c/code\u003e:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-lang-swift\" data-lang=\"lang-swift\"\u003efunc addTwoNumbers(a: Int) -\u0026gt; (Int -\u0026gt; Int){\n func addTheSecondNumber(b: Int) -\u0026gt; Int{\n return a + b\n } …\u003c/code\u003e\u003c/pre\u003e"
June 12, 2014
Swift中的结构体与类的区别(有坑存在)
"\u003ch2 id=\"-\"\u003e结构体和枚举是值类型\u003c/h2\u003e\n\u003cp\u003e在 Swift 中,所有的基本类型:整数(Integer)、浮点数(floating-point)、布尔值(Booleans)、字符串(string)、数组(array)和字典(dictionaries),都是值类型,并且都是以结构体的形式在后台所实现。\u003c/p\u003e\n\u003cp\u003e在 Swift 中,所有的结构体和枚举都是值类型。这意味着它们的实例,以及实例中所包含的任何值类型属性,在代码中传递的时候都会被复制。\u003c/p\u003e\n\u003ch2 id=\"-\"\u003e类是引用类型\u003c/h2\u003e\n\u003cp\u003e与值类型不同,引用类型在被赋予到一个变量,常量或者被传递到一个函数时,操作的并不是其拷贝。因此,引用的是已存在的实例本身而不是其拷贝。\u003c/p\u003e\n\u003ch1 id=\"恒等运算符\"\u003e恒等运算符\u003c/h1\u003e\n\u003cp\u003e因为类是引用类型,有可能有多个常量和变量在后台同时引用某一个类实例。(对于结构体和枚举来说,这并不成立。因为它们作值类型,在被赋予到常量,变量或者传递到函数时,总是会被拷贝。)\u003c/p\u003e\n\u003cp\u003e如果能够判定两个常量或者变量是否引用同一个类实例将会很有帮助。为了达到这个目的,Swift 内建了两个恒等运算符:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e等价于 ( === )\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e不等价于 ( !== )\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e以下是运用这两个运算符检测两个常量或者变量是否引用同一个实例:\u003c/p\u003e\n\u003cp\u003eif …\u003c/p\u003e"
June 12, 2014
Swift中的函数
"\u003cp\u003e对于Swift语言中的函数还是有许多与其它语言不同的地方的。如下:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1. 对于指定函数黑夜参数值的函数,在调用函数的时候,如果需要指定参数值的话,需要以“参数名:值”这种格式调用\u003c/strong\u003e\nfunc join(s1:String, s2: String, joinstr: String = “-“) -\u0026gt; String {\nreturn s1 + joinstr + s2\n}\u003c/p\u003e\n\u003cp\u003elet result = join(“hello”, “world”, joinstr:”===”) //或者直接写前两个值\nprintln(result)\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2. 常量参数和变量参数(Constant and Variable Parameters)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e数参数默认是常量。试图在函数体中更改参数值将会导致编译错误。这意味着你不能错误地更改参数值。\u003c/p\u003e\n\u003cp\u003e但是,有时候,如果函数中有传入参数的变量值副本将是很有用的。你可以通过指定一个或多个参数为变量参数,从而避免自己在函数中定义新的变量。变量参数不是常量,你可以在函数中把它当做新的可修改副本来使用。\u003c/p\u003e\n\u003cp\u003e通过在参数名前加关键字 \u003ccode\u003evar\u003c/code\u003e 来定义变量参数:\u003c/p\u003e\n\u003cp\u003efunc …\u003c/p\u003e"
June 11, 2014
Swift编程语言中的optional(可选)
"\u003ch2 id=\"-\"\u003e可选\u003c/h2\u003e\n\u003cp\u003e使用可选来处理值可能缺失的情况。可选表示:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e有值,等于 x\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e或者\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e没有值\u003c/li\u003e\n\u003c/ul\u003e\n\u003cblockquote\u003e\n\u003cp\u003e注意:C 和 Objective-C 中并没有可选这个概念。最接近的是 Objective-C 中的一个特性,一个方法要不返回一个对象要不返回 \u003ccode\u003enil\u003c/code\u003e, \u003ccode\u003enil\u003c/code\u003e 表示“缺少一个合法的对象”。然而,这只对对象起作用——对于结构体,基本的 C 类型或者枚举类型不起作用。对于这些类型,Objective-C 方法一般会返回一个特殊值(比如 \u003ccode\u003eNSNotFound\u003c/code\u003e)来暗示值缺失。这种方法假设方法的调用者知道并记得对特殊值进行判断。然而,Swift 的可选可以让你暗示任意类型的值缺失,并不需要一个特殊值。\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e来看一个例子。Swift 的 \u003ccode\u003eString\u003c/code\u003e 类型有一个叫做 \u003ccode\u003etoInt\u003c/code\u003e 的方法,作用是将一个 \u003ccode\u003eString\u003c/code\u003e 值转换成一个 \u003ccode\u003eInt\u003c/code\u003e 值。然而,并不是所有的字符串都可以转换成一个整数。字符串 \u003ccode\u003e\u0026quot;123\u0026quot;\u003c/code\u003e 可以被转换成数字 \u003ccode\u003e123\u003c/code\u003e,但是字符串 \u003ccode\u003e\u0026quot;hello, world\u0026quot;\u003c/code\u003e 不行。\u003c/p\u003e\n\u003cp\u003e下面的例子使用 \u003ccode\u003etoInt\u003c/code\u003e 方法来尝试将一个 \u003ccode\u003eString\u003c/code\u003e 转换成 \u003ccode\u003eInt\u003c/code\u003e:\u003c/p\u003e\n\u003cp\u003elet …\u003c/p\u003e"
June 10, 2014
Swift中的字典
"\u003cp\u003e//1.创建字典\u003c/p\u003e\n\u003cp\u003evar dict:Dictionary\u0026lt;Int, String\u0026gt; = [:“美国“,1:“中国“, 2:“英国“]\u003c/p\u003e\n\u003cp\u003evar country = [\u003c/p\u003e\n\u003cp\u003e“china”: “中国“,\u003c/p\u003e\n\u003cp\u003e“en”:“英国“,\u003c/p\u003e\n\u003cp\u003e“usa”:“美国“\u003c/p\u003e\n\u003cp\u003e]\u003c/p\u003e\n\u003cp\u003e//创建一个空的字典\u003c/p\u003e\n\u003cp\u003evar emptyDictionary = Dictionary\u0026lt;String, Float\u0026gt;()\u003c/p\u003e\n\u003cp\u003evar emptyDictionary2 = [:]\u003c/p\u003e\n\u003cp\u003efor (key,value) incountry {\u003c/p\u003e\n\u003cp\u003evar result = key + value\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003e//2.获取字典中的所有键名和键值及字典元素个数\u003c/p\u003e\n\u003cp\u003evar keys = Array(country.keys)\u003c/p\u003e\n\u003cp\u003evar values = Array(country.values)\u003c/p\u003e\n\u003cp\u003evar cnum = country.count\u003c/p\u003e\n\u003cp\u003e//3.访问字典\u003c/p\u003e\n\u003cp\u003evar value = dict[]\u003c/p\u003e\n\u003cp\u003evar value2 = country[“china”]\u003c/p\u003e\n\u003cp\u003e//4.修改字典,修改后,字典中的位置会发生改变\u003c/p\u003e\n\u003cp\u003ecountry[“china”] = “中华人民 …\u003c/p\u003e"
June 10, 2014
swift中的数组操作
"\u003cp\u003evar shopCart: String[] = [“苹果“, “桔子“, “荔枝“]\u003c/p\u003e\n\u003cp\u003evar shoppingList = [“catfilsh”, “water”, “tulips”]\u003c/p\u003e\n\u003cp\u003e//创建一个空数组\u003c/p\u003e\n\u003cp\u003evar emptyArray = String\u003ca href=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e//数组遍历\u003c/p\u003e\n\u003cp\u003efor str inshopCart {\u003c/p\u003e\n\u003cp\u003e println(str)\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003e//带索引值的遍历\u003c/p\u003e\n\u003cp\u003efor (index, value) inenumerate(shopCart) {\n println(“(index+1):(value)“)\n}\u003c/p\u003e\n\u003cp\u003e//判断数组是否为空及数组元素个数\u003c/p\u003e\n\u003cp\u003eifshopCart.isEmpty {\u003c/p\u003e\n\u003cp\u003eprintln(“购物车中无任何商品,请购买”)\u003c/p\u003e\n\u003cp\u003e} else {\u003c/p\u003e\n\u003cp\u003eprintln(“您当前购物车中共 (shopCart.count) 有件商品”)\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003eprintln(“=================”)\u003c/p\u003e\n\u003cp\u003e//数组元素添加,{苹果 桔子 荔枝 芒果}\u003c/p\u003e\n\u003cp\u003eshopCart.append(“芒果“)\u003c/p\u003e\n\u003cp\u003efor str inshopCart {\u003c/p\u003e\n\u003cp\u003eprintln(str)\u003c/p\u003e\n\u003cp\u003e} …\u003c/p\u003e"