我有这个协议继承。
有趣的是,
@objc protocol Base {}
protocol Some : Base {}
检查它的代码 main.swift
:
import Foundation
class Model1 : NSObject {}
extension Model1 : Some {}
class Model2 : NSObject, Some {}
func test() {
let m1: NSObject = Model1()
let m2: NSObject = Model2()
print("m1 is Some? \(m1 is Some)")
print("m2 is Some? \(m2 is Some)")
print("m1 is Base? \(m1 is Base)")
print("m2 is Base? \(m2 is Base)")
}
test()
有趣的是,
swiftc
和swift
的输出不同。swiftc main.swift && ./main
m1 is Some? true
m2 is Some? true
m1 is Base? false
m2 is Base? false
对比
swift main.swift
m1 is Some? true
m2 is Some? true
m1 is Base? true
m2 is Base? false
但问题是 - 为什么我无法将它们中的任何一个转换为Base
?
如果我向Some
添加@objc
,那么每个测试都将通过true
。但目前我不能这样做,这是另一个SO的话题(请参见此处)。
swiftc --version
Apple Swift version 3.0.2 (swiftlang-800.0.63 clang-800.0.42.1)
Target: x86_64-apple-macosx10.9
swift
和swiftc
之间的不一致行为,然后你又转向了一个有些不相关的问题。你尝试过将它们强制转换为Base
吗?发生了什么? - idmeanprint
都有is
运算符。"is运算符在运行时检查表达式是否可以转换为指定的类型。" - paiv