У меня есть контроллер чата с WKInterfaceTable из консервированных сообщений, и каждая строка таблицы - это другой тип контроллера строк, который поставляется с WKInterfaceTable в WatchKit.Словарь преобразования в Swift - «Тип выражения неоднозначен без дополнительного контекста»
Каждый rowController ссылается на MessageSource и MessageType, которые определены в перечислении.
Объявление моего перечисления выглядит хорошо, но синтаксис реализации соответствующего словаря нуждается в некоторой помощи.
Другая проблема, связанная с теми же блоками, - это преобразование Swift моих свойств. Я не уверен, правильно ли я объявил их, поэтому они могут влиять на те же блоки.
Я попытался обрезать как можно больше кода, потому что я знаю, что ему так нравится. Есть несколько ссылок в разных функциях, хотя я включил то, что нужно для того, чтобы держать вещи в явном виде.
Obj-C
controller.m
typedef enum {
MessageSourceIncoming = 1,
MessageSourceOutgoing = 2
} MessageSource;
typedef enum {
MessageTypeText = 1,
MessageTypeVoice = 2,
MessageTypeImage = 3
} MessageType;
@interface ChatController() <WCSessionDelegate>
@property (strong, nonatomic) NSString *shouldSendVoice;
@end
@implementation ChatController {
NSDictionary *_chat;
NSMutableArray *_messages;
//AVAudioPlayer *_player;
}
- (void)dealloc {
_chat = nil;
_messages = nil;
//_player.delegate = nil;
//_player = nil;
}
- (void)awakeWithContext:(id)context {
_chat = context;
[self setupTable];
}
- (void)setupTable {
_messages = [NSMutableArray array];
for (int i = 0; i < rand()%20; i++) {
[_messages addObject:@{@"msg":@[@"Hi", @"OK", @"Nice to meet you", @"Fine"][rand()%4], @"source":@(rand()%2), @"type":@(rand()%3)}];
}
// clear the table rows
[_table removeRowsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, _table.numberOfRows)]];
for (int i = 0; i < _messages.count; i++) {
NSDictionary *messageDic = _messages[i];
[self insertRowForMessage:messageDic];
}
}
- (void)willActivate {
[_table scrollToRowAtIndex:_table.numberOfRows - 1];
if (_shouldSendVoice) {
NSDictionary *messageDic = @{@"source":@(MessageSourceOutgoing), @"type":@(MessageTypeVoice), @"path":_shouldSendVoice};
[_messages addObject:messageDic];
[self insertRowForMessage:messageDic];
_shouldSendVoice = nil;
}
}
Swift попытка
enum MessageSource: Int {
case MessageSourceIncoming = 1
case MessageSourceOutgoing = 2
}
enum MessageType: Int {
case MessageTypeText = 1
case MessageTypeVoice = 2
case MessageTypeImage = 3
}
class ChatController: WKInterfaceController, WCSessionDelegate {
@IBOutlet var table: WKInterfaceTable!
var chat = NSDictionary()
var messages = NSMutableArray()
var shouldSendVoice = NSString()
override func awakeWithContext(context: AnyObject?) {
super.awakeWithContext(context)
chat = context as! NSDictionary
setupTable()
}
override func willActivate() {
super.willActivate()
self.table.scrollToRowAtIndex(table.numberOfRows - 1)
// Type 'Int' does not conform to protocol 'SequenceType'
if (shouldSendVoice) {
// Type of expression is ambiguous without more context
var messageDic = ["source" : MessageSource.MessageSourceOutgoing, "type" : MessageType.MessageTypeVoice, "path" : shouldSendVoice]
messages.addObject(messageDic)
self.insertRowForMessage(messageDic)
shouldSendVoice = String()
}
}
func setupTable() {
self.messages = NSMutableArray()
for (var i : Int32 = 0; i < rand()%20; i += 1) {
messages.addObject("msg" : ["Hi", "OK", "Nice to meet you", "Fine"][rand()%4], "source":(rand()%2), "type" : (rand()%3))
}
self.table.removeRowsAtIndexes(NSIndexSet(indexesInRange:NSMakeRange(0, table.numberOfRows)))
for i in messages.count {
var messageDic = messages[i]
self.insertRowForMessage(messageDic)
}
}
Вы должны уменьшить это в [Minimal, Complete и проверяемый пример] (HTTP: // StackOverflow .com/помощь/mcve). Для такой простой ошибки существует слишком много кода. И, скорее всего, простое упражнение по созданию [MCVE] (http://stackoverflow.com/help/mcve) поможет вам самостоятельно ответить. И если нет, у вас будет гораздо лучшая форма того же вопроса, чтобы публиковать здесь. – nhgrif
Прекратить использование словарей для временных данных. Почему 'messageDic'? Почему бы вам просто не объявить 'struct Message'? Зачем использовать 'NSArray' в Swift? Просто создайте массив Swift с определенным типом, например. 'var messages: [Message] = []'. У вас есть несколько проблем, но все они вызваны плохим стилем программирования и игнорированием типов. У вас, вероятно, также есть множество предупреждений. – Sulthan
Если вы получаете какую-либо «неоднозначную» ошибку, вам нужно предоставить компилятору более конкретную информацию о типе в вашем случае соответствующей аннотацией.Но в основном я согласен с @Sulthan: используйте собственные типы и потрясающие объектно-ориентированные навыки и Swift – vadian