简体   繁体   中英

generic type conforming to a protocol in Swift

Is it possible to require that specific instantiations of generic types conform to a protocol in Swift?

For example, say I have a generic type called Thing<T> . I want Thing<Int> to conform to a certain protocol, but not Thing<T> .

Well, it might not be too onerous, and it might be obvious enough that you've ignored it, but you could make a 'specific instantiation of a generic type' - as:

class ThingOfInt : Thing<Int>, SpecialIntProtocol {
 // implement SpecialIntProtocol (if it isn't already 
 // implemented in an extension)
}

or with a bit more generality:

class IntThing<T:IntegerType> : MyThing<T>, SpecialIntProtocol {
}

In Swift 2.0 you can extend protocols and types

When you extend it you can add a generic where constraints. Only types that matches that rule will be able to use that functionality

Example :

public struct Thing<T> {
  let x: T
}

extension Thing where T : IntegerType {
  func giveMeInt () -> T {
    return x
  }
}

let a = Thing<Int>(x: 10)
a.giveMeInt()

let b = Thing(x: 10.1)
//b.giveMeInt() // Error

This way you can add an extra functionality to Thing<Int> type

I don't know a way to conform to a protocol in the extension, but it doesn't make much sense.

Limitation: Generic where T : can be used with protocols and classes, that's why we can't specify Int there

You can do something like using the where keyword and pass a condition afterwords. Saw this under Where Clauses section https://developer.apple.com/library/mac/documentation/Swift/Conceptual/Swift_Programming_Language/Generics.html#//apple_ref/doc/uid/TP40014097-CH26-XID_275

class Thing<T : SomeProtocol where reflect(T).summary != "Int"> {
    ...
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM