• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Swift 2 generics and derived types
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Swift 2 generics and derived types


  • Subject: Re: Swift 2 generics and derived types
  • From: Jonathan Hull <email@hidden>
  • Date: Wed, 24 Jun 2015 12:53:38 -0700

This is a problem that seems to come up a lot in swift (they really need something like “IntegerArithmeticType” that includes floats, doubles, CGFloats, etc… so we don’t have to cast for simple arithmetic).

I think the trick that IntegerArithmeticType uses is that it has a common form that everything can be transformed into (i.e toIntMax() ).  You could mimic this by turning everything into a double (or an NSDecimalNumber if you care more about precision than speed) for cases where the type doesn’t match.

Someone else may have a more elegant answer...

Thanks,
Jon


> On Jun 24, 2015, at 12:19 PM, Rick Mann <email@hidden> wrote:
>
> I've been experimenting with Swift 2, and have started writing a generic Vector3<T> class. It looks something like this:
>
> -----
> protocol
> VectorElementType: IntegerLiteralConvertible
> {
> 	func +(a: Self, b: Self) -> Self
> }
>
> struct
> Vector3<T where T: VectorElementType>
> {
> 	init()
> 	{
> 		x = 0;
> 		y = 0;
> 		z = 0;
> 	}
>
> 	init(_ inX: T, _ inY: T, _ inZ: T)
> 	{
> 		x = inX
> 		y = inY
> 		z = inZ
> 	}
>
> 	var x: T
> 	var y: T
> 	var z: T
> }
>
> func
> +<T>(inLeft: Vector3<T>, inRight: Vector3<T>)
> 	-> Vector3<T>
> {
> 	return Vector3<T>(inLeft.x + inRight.x, inLeft.y + inRight.y, inLeft.z + inRight.z)
> }
>
>
> extension Float: VectorElementType {}
> extension Double: VectorElementType {}
>
> typealias Vector3f = Vector3<Float>
> typealias Vector3d = Vector3<Double>
> -----
>
> The thing I'd like to do is let the + operator support two different types of Vector3, such that if the individual VectorElementTypes are addable together (either because a + operator exists for both types, or because one type can be promoted to a type that can add), then it all "just works".
>
> In C++, this works because template instantiation happens when the types are introduced, but in Swift, I have to promise that the types will work out that way. But I've not figured out how.
>
> E.g., I can't do this:
>
> var a = Vector3d(1, 2, 3)
> var b = Vector3f(4, 5, 6)
>
> var c = a + b
>
> How might I accomplish this? Thanks!
>
>
> --
> Rick Mann
> email@hidden
>
>
>
> _______________________________________________
>
> Cocoa-dev mailing list (email@hidden)
>
> Please do not post admin requests or moderator comments to the list.
> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
>
> Help/Unsubscribe/Update your Subscription:
>
> This email sent to email@hidden


_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden


References: 
 >Swift 2 generics and derived types (From: Rick Mann <email@hidden>)

  • Prev by Date: Swift 2 generics and derived types
  • Next by Date: Why would creating NSItemReplacementDirectory fail?
  • Previous by thread: Swift 2 generics and derived types
  • Next by thread: Re: Swift 2 generics and derived types
  • Index(es):
    • Date
    • Thread