- 博客(1)
- 资源 (10)
- 收藏
- 关注
转载 tipswindown
///-------------------------------------------------------------------------//jQuery弹出窗口 By Await [2009-11-22]//--------------------------------------------------------------------------/*参数:[可选
2013-04-24 21:25:15
577
swift4.0进阶.zip
王巍
ObjC 中国的创始人之一,objc.io 书籍翻译工作组织者。使用 onevcat 作为 ID 活跃在中国 iOS 开发界,Swift 使用者。
在本书中,我们涵盖了 Swift 程序设计的一些进阶话题。如果你已经通读 Apple 的 Swift 编程指南,并且想要深入探索关于这门语言的更多内容,那么这本书正适合你!
Swift 非常适合用来进行系统编程,而同时它也能被用于书写高层级的代码。我们在书中既会研究像是泛型、协议这样的高层级抽象的内容,也会涉足像是封装 C 代码以及字符串内部实现这样的低层级话题。
2019-07-16
Swifter-Swift 开发者必备 Tips (第四版).zip
Swifter-Swift 开发者必备 Tips (第四版),王巍版本
柯里化 (Currying)
Swift 里可以将方法进行柯里化 (Currying),这是也就是把接受多个参数的方法进行一些变形,使其更加灵活的方法。函数式的编程思想贯穿于 Swift 中,而函数的柯里化正是这门语言函数式特点的重要表现。
举个例子,下面的函数简单地将输入的数字加 1:
func addOne(num: Int) -> Int {
return num + 1
}
这个函数所表达的内容非常有限,如果我们之后还需要一个将输入数字加 2,或者加 3 的函数,可能不得不类似地去定义返回为 num + 2 或者 num + 3 的版本。有没有更通用的方法呢?我们其实可以定义一个通用的函数,它将接受需要与输入数字相加的数,并返回一个函数。返回的函数将接受输入数字本身,然后进行操作:
func addTo(_ adder: Int) -> (Int) -> Int {
return {
num in
return num + adder
}
}
有了 addTo,我们现在就能轻易写出像是 addOne 或者 addTwo 这样的函数了:
let addTwo = addTo(2) // addTwo: Int -> Int
let result = addTwo(6) // result = 8
再举一个例子,我们可以创建一个比较大小的函数:
func greaterThan(_ comparer: Int) -> (Int) -> Bool {
return { $0 > comparer }
}
let greaterThan10 = greaterThan(10);
greaterThan10(13) // => true
greaterThan10(9) // => false
柯里化是一种量产相似方法的好办法,可以通过柯里化一个方法模板来避免写出很多重复代码,也方便了今后维护。
举一个实际应用时候的例子,在 Selector 一节中,我们提到了在 Swift 中 Selector 只能使用字符串在生成。这面临一个很严重的问题,就是难以重构,并且无法在编译期间进行检查,其实这是十分危险的行为。但是 target-action 又是 Cocoa 中如此重要的一种设计模式,无论如何我们都想安全地使用的话,应该怎么办呢?一种可能的解决方式就是利用方法的柯里化。Ole Begemann 在这篇帖子里提到了一种很好封装,这为我们如何借助柯里化,安全地改造和利用 target-action 提供了不少思路。
protocol TargetAction {
func performAction()
}
struct TargetActionWrapper:
TargetAction {
weak var target: T?
let action: (T) -> () -> ()
func performAction() -> () {
if let t = target {
action(t)()
}
}
}
enum ControlEvent {
case TouchUpInside
case ValueChanged
// ...
}
class Control {
var actions = [ControlEvent: TargetAction]()
func setTarget(target: T,
action: @escaping (T) -> () -> (),
controlEvent: ControlEvent) {
actions[controlEvent] = TargetActionWrapper(
target: target, action: action)
}
func removeTargetForControlEvent(controlEvent: ControlEvent) {
actions[controlEvent] = nil
}
func performActionForControlEvent(controlEvent: ControlEvent) {
actions[controlEvent]?.performAction()
}
}
模式匹配
在之前的正则表达式中,我们实现了 =~ 操作符来完成简单的正则匹配。虽然在 Swift 中没有内置的正则表达式支持,但是一个和正则匹配有些相似的特性其实是内置于 Swift 中的,那就是模式匹配。
当然,从概念上来说正则匹配只是模式匹配的一个子集,但是在 Swift 里现在的模式匹配还很初级,也很简单,只能支持最简单的相等匹配和范围匹配。在 Swift 中,使用 ~= 来表示模式匹配的操作符。如果我们看看 API 的话,可以看到这个操作符有下面几种版本:
func ~=(a: T, b: T) -> Bool
func ~=(lhs: _OptionalNilComparisonType, rhs: T?) -> Bool
func ~=(pattern: I, value: I.Bound) -> Bool
从上至下在操作符左右两边分别接收可以判等的类型,可以与 nil 比较的类型,以及一个范围输入和某个特定值,返回值很明了,都是是否匹配成功的 Bool 值。你是否有想起些什么呢..没错,就是 Swift 中非常强大的 switch,我们来看看 switch 的几种常见用法吧:
可以判等的类型的判断
let password = "akfuv(3"
switch password {
case "akfuv(3": print("密码通过")
default: print("验证失败")
}
对 Optional 的判断
let num: Int? = nil
switch num {
case nil: print("没值")
default: print("\(num!)")
}
对范围的判断
let x = 0.5
switch x {
case -1.0...1.0: print("区间内")
default: print("区间外")
}
这并不是巧合。没错,Swift 的 switch 就是使用了 ~= 操作符进行模式匹配,case 指定的模式作为左参数输入,而等待匹配的被 switch 的元素作为操作符的右侧参数。只不过这个调用是由 Swift 隐式地完成的。于是我们可以发挥想象的地方就很多了,比如在 switch 中做 case 判断的时候,我们完全可以使用我们自定义的模式匹配方法来进行判断,有时候这会让代码变得非常简洁,具有条理。我们只需要按照需求重载 ~= 操作符就行了,接下来我们通过一个使用正则表达式做匹配的例子加以说明。
首先我们要做的是重载 ~= 操作符,让它接受一个 NSRegularExpression 作为模式,去匹配输入的 String:
func ~=(pattern: NSRegularExpression, input: String) -> Bool {
return pattern.numberOfMatches(in: input,
options: [],
range: NSRange(location: 0, length: input.characters.count)) > 0
}
然后为了简便起见,我们再添加一个将字符串转换为 NSRegularExpression 的操作符 (当然也可以使用 StringLiteralConvertible,但是它不是这个 tip 的主题,在此就先不使用它了):
prefix operator ~/
prefix func ~/(pattern: String) -> NSRegularExpression {
return NSRegular[removed]pattern: pattern, options: nil, error: nil)
}
现在,我们在 case 语句里使用正则表达式的话,就可以去匹配被 switch 的字符串了:
2019-07-16
Web开发必备资料
JavaScript核心参考手册;
JavaScript语言中文参考手册
微软JavaScript手册js,
jquery1.7+中文手册,
jquery-1.6.2.min,
jquery.cookie,
My97DatePicker,
my97日历帮助文档,
网页流行色选取器,
FastStone Capture(截图工具)
2012-09-06
GridView大全
GridView大全 1
1.GridView无代码分页排序: 2
2.GridView选中,编辑,取消,删除: 2
后台代码: 2
前台主要代码: 4
3.GridView正反双向排序: 5
后台代码: 5
前台主要代码: 7
4.GridView和下拉菜单DropDownList结合: 7
后台代码: 7
前台主要代码: 9
5.GridView和CheckBox结合: 9
后台代码: 10
前台主要代码: 11
6.鼠标移到GridView某一行时改变该行的背景色方法一: 12
前台代码: 13
7.鼠标移到GridView某一行时改变该行的背景色方法二: 14
8.GridView实现删除时弹出确认对话框: 15
9.GridView实现自动编号: 15
10.GridView实现自定义时间货币等字符串格式: 17
前台代码: 18
11.GridView实现用“...”代替超长字符串: 19
后台全部代码: 19
11.GridView一般换行与强制换行: 22
12.GridView显示隐藏某一列: 23
后台全部代码如下: 24
前台代码: 26
13.GridView弹出新页面/弹出制定大小位置新窗口: 27
方案一:简单的方法,新窗口不固定大小 27
方案二:精确控制弹出窗口大小位置 28
14.GridView固定表头(不用javascript只用CSS!,很好用): 28
15.GridView合并表头多重表头无错完美版(以合并3列3行举例) 30
后台代码: 30
前台: 33
16.GridView突出显示某一单元格(例如金额低于多少,分数不及格等) 34
全部后台代码: 34
前台代码: 36
17.GridView加入自动求和求平均值小计 37
后台全部代码: 38
前台: 40
18.GridView数据导入Excel/Excel数据读入GridView 40
后台代码: 41
前台: 43
gridview中的数据进行特殊的显示 44
前台代码: 45
GridView复合多层表头(不限级)!!!收藏 46
2011-04-07
ADO.NET(创建,读取,更新)数据库
创建连接数据库 1
读取数据库 1
1.使用Command和Datareader对象读取数据 1
2.使用Dataadaper与Dataset读取数据 3
更新数据库 4
(1)使用DataSet对象更新数据库 4
//①修改数据 主要代码: 4
//②添加数据 主要代码: 5
//③删除数据 主要代码: 5
(2)使用SqlCommand对象更新数据库 6
//添加数据 6
//修改数据 6
//删除数据 6
2011-04-07
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人