Swift: 类型必须实现协议且是给定类的子类。

15
在Objective-C中,您可以将类型定义为给定类和实现协议的类型:
- (UIView <Protocol> *)someMethod;

这表明someMethod返回的值是实现了给定协议ProtocolUIView。在Swift中是否有类似的强制要求方式呢?


3
类似的问题在这里:https://dev59.com/zl8e5IYBdhLWcg3wb52S?rq=1 - Martin R
这里也有类似的内容:https://dev59.com/Xl8d5IYBdhLWcg3w1E90 - Daniel Galasko
1个回答

10
你可以这样做:
protocol SomeProtocol {
  func someMethodInSomeProtocol()
}

class SomeType { }

class SomeOtherType: SomeType, SomeProtocol {
  func someMethodInSomeProtocol() { }
}

class SomeOtherOtherType: SomeType, SomeProtocol {
  func someMethodInSomeProtocol() { }
}

func someMethod<T: SomeType where T: SomeProtocol>(condition: Bool) -> T {
  var someVar : T
  if (condition) {
    someVar = SomeOtherType() as T
  }
  else {
    someVar = SomeOtherOtherType() as T
  }

  someVar.someMethodInSomeProtocol()
  return someVar as T
}

这定义了一个函数,返回一个类型为 'SomeType' 和协议为 'SomeProtocol' 的对象,并返回符合这些条件的对象。


谢谢。在这种情况下,如果我在 someMethod 中执行以下操作:var v: T; v = MyView(),即使 MyView 是 class MyView : UILabel, Protocol,我仍会收到“MyView 无法转换为 T”的错误。 - Kamchatka
谢谢,这样好多了。但我在实现该方法时仍然遇到以下问题:func someMethod() -> T { var someVar: T someVar.someMethodInSomeProtocol() <-- 错误 "T 没有名为 'someMethodInSomeProtocol' 的成员" return someVar as T } - Kamchatka
你的协议是否真正定义了“someMethodInSomeProtocol()”?如果我在协议中定义并在类中实现,那么我就不会得到你的错误。 - user887210
根据另一个线程(https://dev59.com/zl8e5IYBdhLWcg3wb52S)中的描述,使用where子句似乎可以解决这个问题。func someMethod<T: SomeType, SomeProtocol>()func someMethod<T where T: SomeType, T: SomeProtocol>()不同。我不明白为什么后者不起作用。 - Kamchatka
是的,我经过一些挖掘找到了那个。有趣的是,当我这样做时,我的游乐场会崩溃。我会更新我的答案,并在崩溃时提交一个错误报告。 - user887210
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接