[swift-users] Optional conformance warnings with Protocols
Zhao Xin
owenzx at gmail.com
Sun Jul 24 10:11:32 CDT 2016
Yes. "Implicitly unwrapped optional are merely optionals". That is why
Xcode gives you a warning instead of an error. In other situations, such as
protocol claims an implicitly unwrapped optional but you give an optional,
or protocol claims a non-optional but you give an implicitly unwrapped
optional, you will get errors.
Zhaoxin
On Sun, Jul 24, 2016 at 10:36 PM, Rod Brown <rodney.brown6 at icloud.com>
wrote:
> They are not equal only because the compiler performs the unwrap for you.
>
> My point is the compiler should not emit a warning that I am not adhering
> to the protocol. The thing I am returning is an optional - implicitly
> unwrapped, but optional nonetheless.
>
>
> The fact they are different in actual use by MY code is irrelevant when
> you conform to an external protocol, as long as the actual value (an
> optional) is the same, which they are.
>
> Implicitly unwrapped optional are merely optionals that the compiler is
> told to implicitly unwrap because using the ! operator where it is not
> required because it should never (or almost never) be nil.
>
> I believe this should not throw a warning.
>
>
> On 25 Jul. 2016, at 12:16 am, Zhao Xin <owenzx at gmail.com> wrote:
>
> Implicitly unwrapped optionals and optionals are not equal.
>
> struct X {
>
> let value:String = "aa"
>
> }
>
>
> let x:X? = nil
>
> let y:X! = nil
>
> x?.value // nil
>
> y?.value // nil
>
> y.value // fatal error: unexpectedly found nil while unwrapping an
> Optional value. Unless you don't use this. As this is equal to y!.value.
>
> Zhaoxin
>
>
>
> On Sun, Jul 24, 2016 at 9:55 PM, Rod Brown <rodney.brown6 at icloud.com>
> wrote:
>
>> The final code to test this is:
>>
>> import Foundation
>> import MapKit
>>
>> class ManifestItem: NSObject {
>>
>>
>> let title: String!
>> let subtitle: String?
>> dynamic var coordinate: CLLocationCoordinate2D
>>
>>
>> init(title: String, subtitle: String?, coordinate:
>> CLLocationCoordinate2D) {
>> self.title = title
>> self.subtitle = subtitle
>> self.coordinate = coordinate
>> }
>> }
>>
>> extension ManifestItem: MKAnnotation {
>> }
>>
>> This displays a warning in beta 3, as well as in Swift 2.2 in the current
>> Xcode.
>>
>> I understand why: MKAnnotation declares my title must be optional (“?”)
>> but I am declaring it as an implicitly unwrapped optional (“!”). Still, I
>> believe the fact is that they are both optional, and are a legitimate way
>> of declaring “a protocol I conform to requires this to be optional, but it
>> can be treated as implicitly inwrapped because it will never be nil”.
>>
>> Thoughts?
>>
>> - Rod
>>
>>
>>
>> On 24 Jul 2016, at 11:09 PM, Zhao Xin <owenzx at gmail.com> wrote:
>>
>> I pasted you code into Xcode 8 beta3 playground, everything seemed fine
>> with below code.
>>
>> import Cocoa
>> import CoreLocation
>>
>> class ManifestItem: NSObject {
>> let value: String
>> let title: String
>> let subtitle: String?
>> dynamic var coordinate: CLLocationCoordinate2D
>>
>>
>> init(value:String, title:String, subtitle:String? = nil, coordinate:
>> CLLocationCoordinate2D) {
>> self.value = value
>> self.title = title
>> self.subtitle = subtitle
>> self.coordinate = coordinate
>> }
>> }
>>
>> @objc public protocol MKAnnotation : NSObjectProtocol {
>>
>>
>> // Center latitude and longitude of the annotation view.
>> // The implementation of this property must be KVO compliant.
>> var coordinate: CLLocationCoordinate2D { get }
>>
>>
>> // Title and subtitle for use by selection UI.
>> @objc optional var title: String? { get }
>> @objc optional var subtitle: String? { get }
>> }
>>
>> I didn't encounter the error you mentioned. But I had to remove public
>> and add @objc as Xcode asked.
>>
>> Zhaoxin
>>
>> On Sun, Jul 24, 2016 at 12:09 PM, Rod Brown via swift-users <
>> swift-users at swift.org> wrote:
>>
>>> Hi Swift Users,
>>>
>>> I just ran across an issue where I had the following code:
>>>
>>> class ManifestItem: NSObject {
>>> let value: String
>>> let title: String
>>> let subtitle: String?
>>> dynamic var coordinate: CLLocationCoordinate2D
>>> }
>>>
>>>
>>> As part of utilising this object, I needed it to conform to
>>> MKAnnotation, which declares:
>>>
>>>
>>> public protocol MKAnnotation : NSObjectProtocol {
>>>
>>> // Center latitude and longitude of the annotation view.
>>> // The implementation of this property must be KVO compliant.
>>> public var coordinate: CLLocationCoordinate2D { get }
>>>
>>> // Title and subtitle for use by selection UI.
>>> optional public var title: String? { get }
>>> optional public var subtitle: String? { get }
>>> }
>>>
>>> I added the appropriate extension to “ManifestItem” and promptly got
>>> reminded with an error that MKAnnotation requires title be an optional.
>>>
>>> To do this, I converted “title” in my ManifestItem class to be an
>>> implicitly unwrapped optional. This value can never be nil, and should be
>>> treated as such throughout my code. However, the compiler still emits a
>>> warning. "Type of 'title' has different optionality than expected by
>>> protocol ‘MKAnnotation' "
>>>
>>> I’m wondering if this should be considered a bug? I am actually
>>> comforming correctly to the protocol - title is optional, though implicitly
>>> unwrapped. Should I have to make “title” optional, and every use of it
>>> optional or a force unwrap, when my code verifies that the manifest item is
>>> legitimately invalid if title property is nil?
>>>
>>> I think this is valid use of the implicitly unwrapped optional. It
>>> allows you to say “this is optional for some reason, but should generally
>>> always be assumed to be non null.” This sounds remarkably similar to my use
>>> case "this is optional for conformance reasons, but should generally
>>> always be assumed to be non null.”
>>>
>>> Thanks for your opinions,
>>>
>>> Rod
>>>
>>> _______________________________________________
>>> swift-users mailing list
>>> swift-users at swift.org
>>> https://lists.swift.org/mailman/listinfo/swift-users
>>>
>>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20160724/415ddad9/attachment.html>
More information about the swift-users
mailing list