我无法弄清楚Swift 2的特殊风格map:
我正在读一本字典(来自plist文件),所以我有一个[String: AnyObject]:
let dictionary = NSDictionary(contentsOfFile: path) as? [String: AnyObject]
Run Code Online (Sandbox Code Playgroud)
我的目标是从字典Strings转换为记录器实例字典.这将是[String: XCGLogger]:
let loggers = dictionary
.map { (n, l) in [ n: newLogger(l.0, withLevel: level(l.1)) ] }
Run Code Online (Sandbox Code Playgroud)
但是,这是返回一个[[String: XCGLogger]](看起来像一个字典数组给我).问题是如何返回扁平字典.当我尝试使用时,flatMap我开始围绕关于闭包的错误或者无法在类型上调用flatMap (Key, Value) -> NSDictionary.
我试图弄清楚Slick(Scala功能关系模型).我已经开始在Slick 3.0.0中构建原型,但当然......大多数文档都已过时或不完整.
我已经设法达到了可以创建模式并从数据库返回对象的程度.
问题是,我要回的是"Rep [Bind]"而不是我希望得到的对象.我无法弄清楚这个值是做什么的.例如,如果我尝试像rep.countDistinct.result这样的东西,我就会崩溃.
以下是代码的快速概要...为简洁起见,删除了一些内容:
class UserModel(tag: Tag) extends Table[User](tag, "app_dat_user_t") {
def id = column[Long]("n_user_id", O.PrimaryKey)
def created = column[Long]("d_timestamp_created")
def * = (id.?, created) <> (User.tupled, User.unapply)
}
case class User(id: Option[Long], created: Long)
val users = TableQuery[UserModel]
(users.schema).create
db.run(users += User(Option(1), 2))
println("ID is ... " + users.map(_.id)) // prints "Rep[Bind]"... huh?
val users = for (user <- users) yield user
println(users.map(_.id).toString) // Also prints "Rep[Bind]"...
Run Code Online (Sandbox Code Playgroud)
我找不到一种"解包"Rep对象的方法,但我找不到任何明确的解释它是什么或如何使用它.
我有一个测试应用程序,可以在H2内存数据库中正常工作.现在我正在尝试将它连接到我们的真实数据库.我要么得到一个内部Slick异常,要么得到一个"No suitable driver"异常,这取决于我的方法:
这是我的简单测试(再次,它似乎在内存中运行良好):
"The glimple data model classes" should {
"insert a glimple row in the database" in {
val db = Database.forConfig("db.edb") // works on db.h2mem1
val glimples = TableQuery[GPGlimpleModel]
val insertGlimples = db.run(glimples += GPGlimple(None, None, 1, true, true, 1))
val count = Await.result(insertGlimples, Duration.Inf)
println(count)
count must beEqualTo(1)
...
Run Code Online (Sandbox Code Playgroud)
如果我打开连接池,如下所示:
db.edb = {
driver = org.postgresql.Driver
url = "jdbc:postgresql://db-server-1.hyrax.com:5444/CI_0"
user = "xxx" // masked to protect the innocent
password = "xxx" // masked to protect the …Run Code Online (Sandbox Code Playgroud) 我正在尝试从Slick 3.0(在Play Framework中)调用存储过程.我一直在翻阅文档,但不幸的是,Typesafe中的普通SQL文档从未显示调用存储过程.
看起来非常简单的是导致一个通常模糊的Scala错误消息:
val f = Try {
val call: DBIO[Int] = sqlu"?=call app_glimpulse_invitation_pkg.n_send_invitation(${i.token}, ${i.recipientAccountId.getOrElse(None)}, ${i.email}, ${i.phoneNumber}, ${requestType})"
val result: Future[Int] = db.run(call)
val r = Await.result(result, Duration.Inf) // should only return one; use .seq.count(_.id != null)) to validate
val z = result.value.get.get // should return the stored procedure return value...?
}
Run Code Online (Sandbox Code Playgroud)
上面的代码导致此编译器错误:
[error] /Users/zbeckman/Projects/Glimpulse/Server-2/project/glimpulse-server/app/controllers/GPInviteService/GPInviteService.scala:120: could not find implicit value for parameter e: slick.jdbc.SetParameter[Product with Serializable]
[error] val call: DBIO[Int] = sqlu"?=call app_glimpulse_invitation_pkg.n_send_invitation(${i.token}, …Run Code Online (Sandbox Code Playgroud) 我正在使用Slick 3.0和(当然)几乎所有的例子都包括Slick 2.x. 事情发生了变化,坦率地说,似乎更复杂,而不是更少.
这是一个例子:我想通过id得到一个对象(一个GPPerson).这就是我现在所拥有的,它似乎非常冗长......比Slick 2.x更多:
def get(id: GPID): Option[GPPerson] = Await.result(
db.run(
people.filter(_.id === id).result), Duration.Inf
).headOption
Run Code Online (Sandbox Code Playgroud)
在Slick 2.x中,除了其他因素之外,事情变得更容易了.但上面似乎是我提出的最简洁的表达方式.
它也没有真正解决我需要添加的异常处理.
这让我疯狂...... 必须有一种方法可以在String中删除所有非数字字符(或执行其他简单过滤).
示例:我想将电话号码("+72(93)2342-7772"或"+1 310-777-2341")转换为简单的数字字符串(不是Int),例如"729323427772"或"13107772341" ".
我尝试"[\\d]+".r.findAllIn(phoneNumber)了返回一个Iteratee,然后我不得不将它们重新组合成一个字符串......似乎非常浪费.
我也想出了:phoneNumber.filter("0123456789".contains(_)) 但是对于其他情况来说这变得乏味.例如,删除所有标点符号...我真的在使用正则表达式之后的东西,因此它具有更广泛的应用,而不仅仅是过滤掉数字.
任何人都有一个花哨的Scala单线为此更直接?
我想比较Byte[]包含二进制图像表示的两个(小).我不想使用MD5或SHA或诸如此类的东西,因为没有意义......这些只是迭代数组,计算校验和等,而且没有必要.
这似乎应该有一个超级简单的方法来遍历两个数组中,a1并a2对其进行比较平等,如:
(a1, a2).forall(a, b => a == b)
Run Code Online (Sandbox Code Playgroud)
但这当然不起作用......
我正在尝试解决两个ScalaCheck(+ specs2)问题:
有没有办法改变ScalaCheck生成的案例数量?
如何生成包含某些Unicode字符的字符串?
例如,我想生成大约10个包含字母数字和Unicode字符的随机字符串.但是,此代码始终生成100个随机字符串,并且它们严格基于字母字符:
"make a random string" in {
def stringGenerator = Gen.alphaStr.suchThat(_.length < 40)
implicit def randomString: Arbitrary[String] = Arbitrary(stringGenerator)
"the string" ! prop { (s: String) => (s.length > 20 && s.length < 40) ==> { println(s); success; } }.setArbitrary(randomString)
}
Run Code Online (Sandbox Code Playgroud)
编辑
我刚才意识到还有另一个问题:
当然,我不想要100,但显然我的代码试图生成一套过于复杂的规则.它最后一次运行,我看到"47次测试后放弃了".
我无法弄清楚为什么这不起作用...在编译期间我收到以下错误:
[error] /Users/zbeckman/Projects/Glimpulse/Server-2/project/glimpulse-server/app/service/GPGlimpleService.scala:17: not enough arguments for method apply: (id: Long, glimpleId: Long, layerOrder: Int, created: Long, attachments: List[models.GPAttachment])models.GPLayer in object GPLayer.
[error] Unspecified value parameter attachments.
[error] private val layer1: List[GPLayer] = List(GPLayer(1, 42, 1, 9), GPLayer(2, 42, 2, 9))
Run Code Online (Sandbox Code Playgroud)
对于这个案例类...请注意备用构造函数的定义:
case class GPLayer(id: Long, glimpleId: Long, layerOrder: Int, created: Long, attachments: List[GPAttachment]) {
def this(id: Long, glimpleId: Long, layerOrder: Int, created: Long) = this(id, glimpleId, layerOrder, created, List[GPAttachment]())
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试在Swift中创建一个简单的错误处理结构.我想要做的是返回一个包含"成功"代码或"错误"代码的类型.但是为了使它有点棘手,在错误的情况下,我还想得到一条消息和一个诊断字符串.
我想出了这个,编译得很好,就返回成功/错误而言效果很好:
enum PasswordValidationResult {
case Success
case PasswordError(message: String, diagnostic: String)
func isValid() -> Bool {
switch self {
case .Success:
return true
case .PasswordError:
return false
}
}
}
Run Code Online (Sandbox Code Playgroud)
我可以返回所需的值:
return PasswordValidationResult.PasswordError(message: "You can't do that", diagnostic: "XYZ")
Run Code Online (Sandbox Code Playgroud)
当我尝试引用返回值时出现问题.
显然,我可以使用isValid()函数来测试成功条件,但是我找不到任何引用消息和诊断字符串的语法.
例如,试试这个:
myError = someFunction()
if myError == PasswordValidationResult.Error {
// None of this will compile, at all...
println(myError.message)
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试构建从 Scala 到 JDBC callableStatements 的接口。在大多数情况下,它很简单,除了Lists.
我需要能够采用List某种类型的 Scala ,并将其转换为可以传递给的 Java 数组,statement.setArray(type, array)但我没有任何运气(部分是因为我不太了解 Java 和 JDBC)。
这是我想要做的:
for (parameter <- ps.parameters) {
case GPArrayIn(None, t) => callableStatement.setNull(index, t)
case GPIn(v: Some[_], Types.INTEGER) => callableStatement.setInt(index, v.get.asInstanceOf[Int])
case GPIn(v: Some[_], Types.VARCHAR | Types.LONGVARCHAR) => callableStatement.setString(index, v.get.asInstanceOf[String])
case GPArrayIn(v: Some[List[_]], Types.INTEGER) => callableStatement.setArray(Types.INTEGER, ???? )
case GPArrayIn(v: Some[List[_]], Types.VARCHAR | Types.LONGVARCHAR) => callableStatement.setArray(Types.VARCHAR, ???? )
...
Run Code Online (Sandbox Code Playgroud)
对于简单的值,这非常简单,但是当涉及到setArray()调用时,我被卡住了。
任何建议将不胜感激。被困在这几个小时......
我正在尝试设计("设计合理",而不是"黑客")自定义警报视图.视图应该连接到键盘的顶部; 用键盘向上滑动(如果有警报)或被隐藏(如果没有警报).
视图应始终"粘住"键盘...例如,包括键盘隐藏时.在这种情况下,视图应该与键盘一起向下滑动,在视线之外.
以下是我正在尝试实现的示例(使用活动警报):

我原本考虑过继承UIAlertView,但看起来不推荐这样做.经过一些实验,这显然是一个棘手的任务.我有一个警报显示但是,它变成了与键盘保持同步的问题,而我还没有找到一种方法让它与键盘的运动"跟踪"......不顺利.
有任何想法吗?
scala ×9
slick ×4
swift ×3
postgresql ×2
arrays ×1
dictionary ×1
enums ×1
filter ×1
ios ×1
java ×1
jdbc ×1
scalacheck ×1
specs2 ×1
swift2 ×1
syntax ×1
uialertview ×1
uikit ×1
unicode ×1