小编rfr*_*lli的帖子

Swift泛型不保留类型

我正在尝试基于指定的泛型类型转换和/或生成变量.我知道swift中没有类型擦除,但它似乎不是泛型保留类型,而不是通用的指定条件,例如符合基类.似乎所有我可以投射或初始化的是基类.更奇怪的是,当我在调试器中时,泛型似乎有一个RawPointer到正确的类,甚至变量看起来像他们是正确的类型:

编辑:

从Xcode 6.1开始,这仍然是个问题(简化代码由Gregory Higley提供):

class BaseClass {
    func printme() -> Void {
        println("I am BaseClass")
    }
}

class DerivedClass : BaseClass {
    override func printme() -> Void {
        println("I am DerivedClass")
    }
}

class Util<T: BaseClass> {
    func doSomething() {
        var instance = T()
        instance.printme()
    }
}

var util = Util<DerivedClass>()
util.doSomething()
Run Code Online (Sandbox Code Playgroud)

仍打印出"我是BaseClass"

还要注意基类中所需的init {}不再有效.

在此输入图像描述

generics swift xcode6

17
推荐指数
2
解决办法
2955
查看次数

何时使用Option/None返回类型

我理解Some/None/Option背后的整个原理和概念,我当然可以理解它的优点.我的问题更多是最佳做法.什么时候变得矫枉过正,什么时候有意义地使用它.我认为(我可能是错的)但是尽可能多地使用它是有道理的,因为它是一种更安全的方式来传递任何东西(而不是null).我看到自己做了很多事情,虽然有一些功能乱七八糟的地图,getOrElse,get,match甚至有时嵌套它们往往看起来很难看.是否有一些我缺少的概念或一些最佳实践与接收多个Optional值的函数有关.例如:

  def updateJobs(id: Int) = withAuth {
    request => {

      User.userWithToken(request.headers.get("token").get).map {
        user =>
          Job.jobsAfterIdForForeman(id.toString, user.id.toString) match {
            case Some(json) => Ok(json)
            case _ => NoContent
          }
      }.getOrElse(BadRequest)
    }
  }
Run Code Online (Sandbox Code Playgroud)

甚至更糟的例如:

  def addPurchaseRequest(json: JsValue) = {
    (json \ "jobId").asOpt[Long].map {
      jobId => JobDAO.jobWithId(jobId).map {
        job => PurchaseRequestDAO.insert(new PurchaseRequest(json, job)).map {
          model =>
            val request = model.asInstanceOf[PurchaseRequest]
            (json \ "items").asOpt[List[JsObject]].map {
              list => {
                if (PurchaseItemAssociationDAO.bulkInsert(PurchaseItemAssociation.itemsFromJsonArray(list, request.id))) Option(request.addResponseJson) else None
              }
            }.getOrElse(None)
        }.getOrElse(None)
      }.getOrElse(None)
    }.getOrElse(None)
  }
Run Code Online (Sandbox Code Playgroud)

我设法重构一些看起来不那么疯狂,但有没有更好的方法来重构这个看起来不那么疯狂?我错过了什么或你是否习惯了这样的事情?似乎应该有一个更清洁的做法.

scala scala-2.10

3
推荐指数
1
解决办法
248
查看次数

获取实现类Scala的类型

如何获取实现类的类型或类符号。这总是会给我类模型。我什至尝试使用泛型,但是编译器不喜欢 typeOf[T] 并且无论如何它都很丑陋。非常感谢任何帮助。

import scala.reflect.runtime.universe._

abstract class Model {
  def className = typeOf[this.type].typeSymbol.asClass
}
Run Code Online (Sandbox Code Playgroud)

scala scala-2.10

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

包含选项的列表/数组

哪个在实践中更好?有可选列表或列表中有可选项吗?

目前我正在关注一个可选列表.

列出[选项[T]]或选项[列表[T]]?

编辑:

我遇到的问题是我有crud操作,我正在返回可选类型.我有一种情况,我有一个方法,只进行一次查找,我想利用它来创建一个返回列表的函数.我仍然在用scala弄湿我的脚,所以我很好奇最佳做法是什么.

例:

def findOne(id: Int): Option[T]
Run Code Online (Sandbox Code Playgroud)

无论实现我想用它来做这样的事情,但哪个更好?它们似乎都很奇怪.也许我总是缺少一些东西:

def find(ids: List[Int]) : Option[List[T]]
Run Code Online (Sandbox Code Playgroud)

VS

def find(ids: List[Int]) : List[Option[T]]
Run Code Online (Sandbox Code Playgroud)

monads scala optional

-4
推荐指数
1
解决办法
187
查看次数

标签 统计

scala ×3

scala-2.10 ×2

generics ×1

monads ×1

optional ×1

swift ×1

xcode6 ×1