As Andrew says - I have several cases where I mark a method on a subclass as 
unavailable to ensure subclasses do not call it directly, but it is required by 
the root class to be implemented (which it is and gets called).

Example:

class Root {
        func doSomething() {
                print("Root")
        }
}

class Subclass {
        @available(*, unavailable)
        override func doSomething() {
                super.doSomething()
                print("Subclass")
        }       
}

And you can still do:

let instance: Root = Subclass()
instance.doSomething()

and it will call Root Subclass.

If it's renamed, you should really first deprecate it and just call the new API 
and after a while make it unavailable with no change in the code.

If it's meant for abstract classes, then it's kind of a different issue.



> On Jun 11, 2016, at 3:51 AM, Andrew Bennett via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> Unavailable doesn't mean un-callable.
> If you're marking an override or required initialiser as unavailable, it's 
> still possible it's called dynamically, or by super.
> If you're marking it unavailable for some OS versions, it could still be 
> called by the other OS versions.
> If it's neither of those two categories, you probably don't even need the 
> function declaration.
> It's not clear what default behaviour you would want in an unavailable 
> method, calling super, calling a new method, a runtime error, ...
> 
> An undefined implementation lacks clarity, as Erica says, "this is an example 
> where concision is overrated".
> 
> Likewise, as Brent says, you may want the old unavailable API to call through 
> to the new API.  A new version of a library may be dynamically linked by 
> something compiled against an older version.
> 
> 
> On Sat, Jun 11, 2016 at 10:47 AM, John McCall via swift-evolution 
> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
> > On Jun 10, 2016, at 2:22 PM, Austin Zheng via swift-evolution 
> > <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
> >
> > Hello swift-evolutioneers,
> >
> > Here's an idea. It's technically additive, but it's small and I think it 
> > fits in well with Swift 3's goals, one of which is to establish API 
> > conventions.
> >
> > Right now, you can declare a function, type member, etc and mark it using 
> > "@available(*, unavailable, renamed:"someNewName()")". Doing so causes a 
> > compile-time error if the user tries to use that member, and if you provide 
> > the new name a fix-it is even generated telling you to use the new name.
> >
> > However, you can (and still need to) provide an implementation (e.g. 
> > function body). You can just stick a fatalError() inside and be done with 
> > it, but my question is, is an impl even necessary?
> >
> > My pitch is very simple: the declaration of any member marked with 
> > @available(*, unavailable), or in other words marked as unavailable 
> > regardless of platform or version, should be allowed to omit the 
> > implementation.
> >
> > So, instead of:
> >
> > @available(*, unavailable, renamed:"someNewAPI()")
> > public func someOldAPI() -> Int { fatalError() }
> >
> > You can just have:
> >
> > @available(*, unavailable, renamed:"someNewAPI()")
> > public func someOldAPI() -> Int
> >
> > The intent is, in my opinion, clearer for the latter and it feels less 
> > kludgy.
> >
> > What do people think? Are there any potential barriers (implementation or 
> > semantics) that would preclude this?
> 
> I actually just consider it a bug that you're require to implement an 
> always-unavailable function.  We can take it through evolution anyway, though.
> 
> John.
> 
> >
> > Best,
> > Austin
> >
> > _______________________________________________
> > swift-evolution mailing list
> > swift-evolution@swift.org <mailto:swift-evolution@swift.org>
> > https://lists.swift.org/mailman/listinfo/swift-evolution 
> > <https://lists.swift.org/mailman/listinfo/swift-evolution>
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
> https://lists.swift.org/mailman/listinfo/swift-evolution 
> <https://lists.swift.org/mailman/listinfo/swift-evolution>
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to