小编Pav*_*vel的帖子

Swift 错误:无法在强制中将类型 B 的值转换为类型 A

我有一个通用类 A 及其子类 B:

class A<T1: Any,T2: Any> {
    let x: T1
    let y: T2
    init (_ v1: T1, _ v2: T2) {
        self.x=v1
        self.y=v2
    }
}

class B<T: Any>: A<T,T> {
    init (_ v: T) {
        super.init(v,v)
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要一个不同对象的集合,它们都属于 A 的子类:

var arr=[A<Any,Any>]()
Run Code Online (Sandbox Code Playgroud)

但是我无法将对象放入集合中,以下代码导致错误:

let t=B(10)
arr.append(t as A<Any,Any>)
Run Code Online (Sandbox Code Playgroud)

错误是:

无法在强制转换中将“B”类型的值转换为“A”类型(又名“A,协议<>>”)

如何解决这个问题?

generics swift

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

Common Lisp 异常后如何继续正常执行?

我想捕获unbound-variable异常并避免它们,即时创建一些变量而不会中断执行。我正在尝试在以下代码中使用handler-bindwith invoke-restart

(defmacro my-progn (&rest rest)
  `(handler-bind
    ((unbound-variable
      (lambda (x)
        (progn
          ;(format t "UNBOUND VAR: ~a~%"
          ;  (symbol-name (cell-error-name x)))
          (invoke-restart 'just-continue)))))
    (progn ,@(mapcar (lambda (x)
                      `(restart-case ,x (just-continue () "XXXX"))) rest))))

(my-progn
  (print "AAA")
  (print xxxx) ;; xxxx is unbound
  (print "BBB"))

Run Code Online (Sandbox Code Playgroud)

结果是:

"AAA"
"BBB" 
Run Code Online (Sandbox Code Playgroud)

但我想继续执行 second print,只需将未绑定的变量 xxxx 替换为字符串“XXXX”:

"AAA"
"XXXX"
"BBB" 
Run Code Online (Sandbox Code Playgroud)

当然,我可以用 包裹语法树中的任何符号handler-bind,但我担心这会产生巨大的开销。

有没有办法只捕获unbound-variable异常并使用动态生成的值而不是丢失的变量继续执行代码?

error-handling sbcl common-lisp condition-system

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

如何在common lisp中指定#'sqrt的返回类型?

我正在尝试启用速度优化是 SBCL 2.3.1。编译如下代码:

(defun test (x y)
  (declare (optimize speed))
  (declare (type single-float x y))
  (+ x (sqrt y)))
Run Code Online (Sandbox Code Playgroud)

产生以下注释:

; processing (DEFUN TEST ...)

; file: /var/tmp/slimeftWp5F
; in: DEFUN TEST
;     (SQRT RT-SPEC::Y)
; 
; note: unable to
;   optimize
; due to type uncertainty:
;   The result is a (VALUES (OR (COMPLEX SINGLE-FLOAT) (SINGLE-FLOAT -0.0))
;                           &OPTIONAL), not a (VALUES FLOAT &REST T).

;     (+ RT-SPEC::X (SQRT RT-SPEC::Y))
; 
; note: forced to do GENERIC-+ (cost 10) …
Run Code Online (Sandbox Code Playgroud)

lisp sbcl common-lisp

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