小编Kul*_*mpa的帖子

Swift - CGAffineTransformInvert:奇异矩阵.UITextView和iAd

我有使用UITextView的View Controller,在底部我有iAds.

当我访问View Controller时出现错误:<Error>: CGAffineTransformInvert: singular matrix. 为什么?

一切正常,但当我从肖像改为横向,反之亦然,我得到两次这个错误.

也许UITextView和iAds出了问题?

matrix uitextview singular iad swift

14
推荐指数
1
解决办法
906
查看次数

在json4s中提取多态类型

我正在使用json4s来处理我的Scala代码中的JSON对象.我想将JSON数据转换为内部表示.以下学习测试说明了我的问题:

"Polimorphic deserailization" should "be possible" in {
    import org.json4s.jackson.Serialization.write
    val json =
      """
        |{"animals": [{
        |  "name": "Pluto"
        |  }]
        |}
      """.stripMargin
    implicit val format = Serialization.formats(ShortTypeHints(List(classOf[Dog], classOf[Bird])))
    val animals = parse(json) \ "animals"
    val ser = write(Animals(Dog("pluto") :: Bird(canFly = true) :: Nil))
    System.out.println(ser)
    // animals.extract[Animal] shouldBe Dog("Pluto") // Does not deserialize, because Animal cannot be constructed
}
Run Code Online (Sandbox Code Playgroud)

假设有一个JSON对象,它有一个动物列表.Animal是一种抽象类型,因此无法实例化.相反,我想解析JSON结构以返回其中一个DogBird对象.他们有不同的签名:

case class Dog(name: String) extends Animal
case class Bird(canFly: Boolean) extends Animal
Run Code Online (Sandbox Code Playgroud)

因为它们的签名是不同的,所以可以在JSON对象中没有类Tag的情况下识别它们.(确切地说,我收到的JSON结构不提供这些标签). …

scala json4s

12
推荐指数
1
解决办法
6445
查看次数

SLF4J初始化 - 替代记录器

我正在Scala中做一个项目,我正在使用带有Logback的slf4j进行日志记录.现在,日志记录初始化似乎不是线程安全的.作为解决方案,slf4j正在创建替代记录器,即NoOp-loggers,它吞下初始化期间生成的日志语句.slf4j主页说明了这件事:

替代记录器是在底层日志记录系统的默认配置阶段创建的

高度可配置的日志记录系统(如logback和log4j)可以创建在自己的初始化期间调用记录器的组件.有关典型事件,请参阅问题LOGBACK-127.但是,由于SLF4J的绑定过程尚未完成(因为底层日志记录系统尚未完全加载到内存中),因此无法遵守此类记录器创建请求.

为了避免这种鸡蛋问题,SLF4J在此阶段(初始化)创建了替代记录器.在此阶段对替代记录器进行的调用将被删除.初始化完成后,替代记录器会将日志记录调用委托给相应的记录器实现,否则将像LoggerFactory返回的任何其他记录器一样运行.

如果必须创建任何替代记录器,SLF4J将发出此类记录器的列表.此列表旨在让您知道在初始化期间对这些记录器进行的任何日志记录调用都已被删除.

还有一个尚未解决的问题描述了这个问题.

对我来说,当我测试应用程序的各个部分如何协同工作时,问题就出现了.在自己的线程中运行的生产者的日志语句丢失了,因为它们被发送到替代记录器.在创建生产者线程之前添加日志语句似乎有助于及时初始化记录器.但是,我想知道在应用程序中对LoggerFactory.getLogger的任意调用是否保证我永远不会登录到替代记录器.

简而言之,我的问题是:

  • LoggerFactory.getLogger(classOf [A])是否实例化所有记录器,或者可能是两个以后对LoggerFactory.getLogger(classOf [B])的并发调用将产生一个替代记录器?

  • 有没有办法获得保证,即检查,记录器已初始化(我无法检查记录器的类型,因为它被slf4j外观隐藏)编辑:实际上,我只是认为我可能是能够检查记录器的类型.以下想法能否带来有用的解决方案?:

    def logger(context: Class[_]) = {
      log = LoggerFactory.getLogger(context)
      if (log.isInstanceOf[SubstituteLogger]) logger(context) else log
    
    Run Code Online (Sandbox Code Playgroud)

    我用这种方法看到的问题是它依赖于一个特定于实现的类,即NOPLogger SubstituteLogger.

附录:我不确定这是否与此问题相关,但我将slf4j记录器包装在一个类中,该类为每个日志记录上下文实例化(context =调用记录器的类).此外,还有一个对象创建此包装器的实例,该实例作为隐式构造函数参数传递给要进行日志记录的每个类.我将记录器作为参数传递,而不是记录到静态对象(或混合在特征中)以启用在单元测试中传递特殊记录器.

logging scala logback slf4j race-condition

9
推荐指数
1
解决办法
1776
查看次数

我如何为协变泛型类型参数添加别名

以下代码无法编译(在Scala 2.11中):

case class CovariantClass[+R](value: R) {
  type T = R
  def get: R = value
}

object Main {
  def main(args: Array[String]): Unit ={
    println(CovariantClass[String]("hello").get)
  }
}
Run Code Online (Sandbox Code Playgroud)

错误消息是:

Error:(4, 8) covariant type R occurs in invariant position in type R of type T
  type T = R
       ^
Run Code Online (Sandbox Code Playgroud)

为什么我不能为协变类型参数添加别名?如果我删除该行type T = R,代码编译并打印hello,所以别名似乎是问题.不幸的是,这意味着我无法为更复杂的类型创建别名,例如type T = List[R],虽然List是协变的,但也不会编译.

scala covariance type-alias

5
推荐指数
1
解决办法
528
查看次数