- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
注:本文详细讲解泛型,对写一些公共方法,共用的东西的时候很有帮助。想成为一个优秀的程序员吗?这个必须掌握
泛型代码可以让你写出根据自我需求定义、适用于任何类型的,灵活可重用的函数和类型。
下面直接看一个简单的示例 , 泛型其实就是在写的时候不指定是哪种类型 , 只有再用得时候才指定类型 ,这些类型可以给一些限定。例如 Array``Dictionary
等
写一个简单的交换数据的方法,不限定类型
func swapTwoValue<T>(inout a:T,inout _ b:T){
let temp:T = a
a = b
b = temp
}
这里用T
代表一种类型 ,但是没有指定 , 在函数参数和函数体中都可以使用
var a = 10 , b = 20
swapTwoValue(&a, &b)
print("\(a) , \(b)")//20 , 10
var c = "hello" ,d = "world"
swapTwoValue(&c, &d)
print("\(c) , \(d)") //world , hello
可以看到用Int
和 String
类型都可以使用此方法
T只代表一种类型 如果传入两种类型就会报错
var s1 = "hello"
var s2 = 10
swapTwoValue(&s1, &s2)// cannot invoke 'swapTwoValue' with an argument list of type '(inout String, inout Int)'
当然你也可以指定两种类型
func dic<k,v>(a:k,_ b:v){
}
我们这里模拟实现一个栈的操作。栈的特点是后进先出
struct IntStack{
var items = [Int]()
mutating func push(item:Int){
items.append(item)
}
mutating func pop(){
items.removeLast()
}
}
var intStack = IntStack();
intStack.push(1);
print(intStack.items) //[1]
这是一个Int类型的 ,我们看下泛型的
struct Stack<T>{
var items = [T]()
mutating func push(item:T){
items.append(item)
}
mutating func pop()->T{
return items.removeLast()
}
subscript(i:Int)->T{
get{
return items[i]
}
set{
items[i]=newValue
}
}
}
var stack = Stack<String>();
stack.push("hello")
stack.push("ww")
print(stack[0]) //hello
stack[1] = "world"
print(stack) //Stack<Swift.String>(items: ["hello", "world"]
这里只实现了基本的pop 和push功能
我们也可以扩展我们的泛型 ,而且不需要提供参数类型
extension Stack{
var topItem:T?{
return items.isEmpty ? nil:items[items.count-1]
}
}
var s1 = Stack<Int>();
s1.push(20)
s1.push(19)
print(s1.topItem) //Optional(19)
我们也可以对泛型进行约束
protocol A{}
func func1<T:A>(t:T){
}
这里这个泛型类型必须为协议A的遵循者 , 这里也可以写某个类 代表类的继承者
不是所有的 Swift 中的类型都可以用等式符(==)进行比较。例如,如果你创建一个你自己的类或结构体来表示一个复杂的数据模型,那么 Swift 没法猜到对于这个类或结构体而言“等于”的意思。
不过,所有的这些并不会让我们无从下手。Swift 标准库中定义了一个Equatable
协议,该协议要求任何遵循的类型实现等式符(==)和不等符(!=)对任何两个该类型进行比较。所有的 Swift 标准类型自动支持Equatable
协议。
func findIndex<T: Equatable>(array: [T], valueToFind: T) -> Int? {
for (index, value) in array.enumerate() {
if value == valueToFind {
return index
}
}
return nil
}
let strs = ["sss","aaa","ddd"];
print(findIndex(strs, valueToFind: "ddd")) //2
关联类型
当定义一个协议时,有的时候声明一个或多个关联类型作为协议定义的一部分是非常有用的。一个关联类型给定作用于协议部分的类型一个节点名(或别名)。作用于关联类型上实际类型是不需要指定的,直到该协议接受。关联类型被指定为typealias关键字。
protocol Container{
//声明一个类型 不指定是什么类型
typealias itemType
mutating func append(item:itemType)
subscript(i:Int)->itemType{ get }
}
这里定义一个协议 , 声明一个类型 不指定是什么类型 , 然后有个append有一个itemType类型的参数 , 还有个下标脚本,就是数组的基本操作
struct Quene<T>:Container{
var items = [T]()
//可以推断出是T
mutating func append(item:T)
{
items.append(item)
}
subscript(i:Int)->T{
return items[i]
}
}
这里可以智能推断是typealias itemType
就是这里的泛型T
非常简单 ,使用就不再赘述
我们也可以使用where
字句来约束泛型 ,放在泛型参数后面即可 。
//可以通过where语句来定义约束
func compare<c1:Container,c2:Container
where c1.itemType == c2.itemType,c1.itemType:Equatable>(a:c1 , _ b:c2){
//这里就可以为所欲为了
}
学习iOS,有他就够了,小码哥视频,传智、黑马、各种swift书籍
有没有办法在 .swift 文件(编译成 .swift 模块)中声明函数,如下所示: 你好.swift func hello_world() { println("hello world")
我正在尝试使用 xmpp_messenger_ios 和 XMPPFramework 在 iOS 上执行 MUC 这是加入房间的代码。 func createOrJoinRoomOnXMPP()
我想在我的应用程序上创建一个 3D Touch 快捷方式,我已经完成了有关快捷方式本身的所有操作,它显示正确,带有文本和图标。 当我运行这个快捷方式时,我的应用程序崩溃了,因为 AppDelegate
我的代码如下: let assetTag = Expression("asset_tag") let query2 = mdm.select(mdm[assetTag],os, mac, lastRe
我的 swift 代码如下所示 Family.arrayTuple:[(String,String)]? = [] Family.arrayTupleStorage:String? Family.ar
这是我的 JSON,当我读取 ord 和 uniq 数据时出现错误 let response2 : [String: Any] = ["Response":["status":"SUCCESS","
我想将 swift 扩展文件移动到 swift 包中。但是,将文件移动到 swift 包后,我遇到了这种错误: "Type 'NSAttributedString' has no member 'ma
使用CocoaPods,我们可以设置以下配置: pod 'SourceModel', :configurations => ['Debug'] 有什么方法可以用 Swift Package Manag
我正在 Xcode 中开发一个 swift 项目。我将其称为主要项目。我大部分都在工作。我在日期选择器、日期范围和日期数学方面遇到了麻烦,因此我开始了另一个名为 StarEndDate 的项目,其中只
这是 ObjectiveC 代码: CCSprite *progress = [CCSprite spriteWithImageNamed:@"progress.png"]; mProgressBar
我正在创建一个命令行工具,在 Xcode 中使用 Swift。我想使用一个类似于 grunt 的配置文件确实如此,但我希望它是像 Swift 包管理器的 package.swift 文件那样的快速代码
我假设这意味着使用系统上安装的任何 swift 运行脚本:#!/usr/bin/swift 如何指定脚本适用的解释器版本? 最佳答案 Cato可用于此: #!/usr/bin/env cato 1.2
代码说完全没问题,没有错误,但是当我去运行模拟器的时候,会出现这样的字样: (Swift.LazyMapCollection (_base:[ ] 我正在尝试创建一个显示报价的报价应用。 这是导入
是否可以在运行 Swift(例如 Perfect、Vapor、Kitura 等)的服务器上使用 RealmSwift 并使用它来存储数据? (我正在考虑尝试将其作为另一种解决方案的替代方案,例如 no
我刚开始学习编程,正在尝试完成 Swift 编程书中的实验。 它要求““编写一个函数,通过比较两个 Rank 值的原始值来比较它们。” enum Rank: Int { case Ace = 1 ca
在您将此问题标记为重复之前,我检查了 this question 它对我不起作用。 如何修复这个错误: error: SWIFT_VERSION '5.0' is unsupported, suppo
从 Xcode 9.3 开始,我在我的模型中使用“Swift.ImplicitlyUnwrappedOptional.some”包裹了我的字符串变量 我不知道这是怎么发生的,但它毁了我的应用程序! 我
这个问题在这里已经有了答案: How to include .swift file from other .swift file in an immediate mode? (2 个答案) 关闭 6
我正在使用 Swift Package Manager 创建一个应用程序,我需要知道构建项目的配置,即 Debug 或 Release。我试图避免使用 .xcodeproj 文件。请有人让我知道这是否
有一个带有函数定义的文件bar.swift: func bar() { println("bar") } 以及一个以立即模式运行的脚本foo.swift: #!/usr/bin/xcrun s
我是一名优秀的程序员,十分优秀!