2016-05-18 3 views
4

Например, этот фрагмент взят из UIColor определения в Swift:Swift: Как объявить свойство с именами классов

// Access the underlying CGColor or CIColor. 
public var CGColor: CGColor { get } 

Однако попытки сделать то же самое, скажем NSError, в своем собственном классе приводит к ошибке:

public class MyClass { 
    public var NSError: NSError { 
     return NSError(domain: "mydomain", code: 0, userInfo: [:]) 
    } 
} 

var линия показывает Use of undeclared type 'NSError'.

Возможно ли это? Каков хороший способ сделать это?

компании Apple Swift версия 2.2 (swiftlang-703.0.18.1 лязг-703.0.29)
Цель: x86_64-яблочно-macosx10.9

+0

подтвердил простой 'Foo' класса –

ответ

4

Вы могли сделать это путем создания typealias для NSError, NSErrorRef. Затем вы будете ссылаться на эти типы сообщений в своем классе, поскольку NSError теперь будет ссылаться на свойство, а не на класс.

public typealias NSErrorRef = NSError 

public class MyClass { 
    public var NSError:NSErrorRef { 
     return NSErrorRef(domain: "", code: 0, userInfo: nil) 
    } 
} 

Однако, я бы никогда не рекомендовать.

Я подозреваю, что единственная причина, по которой CGColor названа так в заголовке Swift UIColor, - это просто обеспечить совместимость с Objective-C. Что касается того, почему он работает без каких-либо запутанных ошибок, я не могу сказать. Хотя, если вы действительно посмотрите в документах UIColor, вы увидите CGColor is actually listed as cgColor (когда выбран Swift), который показывает, что даже Apple думает, что он не определен правильно!

В любом случае в соглашении говорится, что свойства должны начинаться с буквы нижнего регистра (чтобы предотвратить такое замешательство в первую очередь). Таким образом, вы могли бы сделать это вместо:

public class MyClass { 
    public var nsError:NSError { 
     return NSError(domain: "", code: 0, userInfo: nil) 
    } 
} 

Или еще лучше, вы могли бы просто назвать свою собственность error - префиксы должны быть редко используется в Swift в любом случае (если не нужно неоднозначности - что вы на самом деле, по всей видимости нужно сделать в твоем случае).

public class MyClass { 
    public var error:NSError { 
     return NSError(domain: "", code: 0, userInfo: nil) 
    } 
} 
+0

Класс фактически является класс ошибок, так простой' error' свойство не имеет особого смысла. Я хочу предоставить аксессуар, чтобы получить «NSError», таким образом, вопрос. Во всяком случае, спасибо за ответ !!! – chakrit

+1

@chakrit Ah well 'nsError' тогда имеет смысл в этой ситуации, чтобы устранить неоднозначность. С удовольствием помогу :) – Hamish

Смежные вопросы