2014-10-24 2 views
0

Эй оригинальное яблоко гид в Obj-C здесь,Swift NSTableView конвертировать Obj-C для быстрой

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/TableView/PopulatingView-TablesProgrammatically/PopulatingView-TablesProgrammatically.html#//apple_ref/doc/uid/10000026i-CH14-SW6

пример 3,2

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

'AnyObject?' does not have a member named 'identifier' 
line: result.identifier = "HelloWorld" 

и

error: cannot convert the expression's type 'AnyObject?' to type '()' 
Line: return result 

Что я делаю неправильно?

func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn, row: Int){ 
    var names: [String] = ["Anna","Alex","brain","jack","gg"] 
    var result: AnyObject? = tableView.makeViewWithIdentifier("HelloWorld", owner: self) 

    if result == nil 
    { 
     // Create the new NSTextField with a frame of the {0,0} with the width 
     // of the table. 
     result = NSTextField(frame: NSRect()) 
     // set identifier of the NSTextField instance to HelloWorld. 
     result.identifier = "HelloWorld" 

    } 

    result = names[row] 
    return result 

} 

Новый Рабочий код

func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn, row: Int) -> NSTextField{ 


    var names = ["Anna","Alex","Brain","Jack","Hello"] 
    var result: NSTextField? = tableView.makeViewWithIdentifier("HelloWorld", owner: self) as? NSTextField   
    if result == nil 
    { 
     // Create the new NSTextField with a frame of the {0,0} with the width 
     // of the table. 
     result = NSTextField(frame: NSRect()) 
     // set identifier of the NSTextField instance to HelloWorld. 
     result?.identifier = "HelloWorld" 

    } 
    result!.bezeled = false 
    result?.stringValue = names[row] 
    return result! 
} 

ответ

1

Здесь:

var result: AnyObject? = tableView.makeViewWithIdentifier("HelloWorld", owner: self) 

вы объявили result переменную в качестве дополнительного AnyObject - и этот протокол не имеет identifier свойство, которое вместо этого свойство NSTextField.

Что вы должны сделать, это объявить эту переменную с помощью правильного типа:

var result: NSTextField? = tableView.makeViewWithIdentifier("HelloWorld", owner: self) as? NSTextField 

, который также может быть сокращен благодаря Выведение типов:

var result = tableView.makeViewWithIdentifier("HelloWorld", owner: self) as? NSTextField 

Side Примечание: Я думаю, что ваш if проверяет на противоположное состояние:

if result != nil 

в то время как я думаю, что это должно быть:

if result == nil 

Боковая примечание 2

Там нет возвращаемого значения объявлена ​​в функции, но вы возвращаете экземпляр NSTextField. Вы должны изменить подпись:

func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn, row: Int) -> NSView 

и изменить оператор возврата к:

return result! 

Обратите внимание, что result определяется как дополнительный, но, глядя на реализации метода, в концовке не- доступно значение nil, поэтому я использовал принудительное разворачивание и объявил метод возвращать необязательное значение. Конечно, не стесняйтесь изменять это, если хотите.

+0

Я сделал эти два изменения, но столкнулся с проблемой в статусе возврата «Невозможно преобразовать тип выражения« NSTextField »? для ввода '()' 'идентификатор действительно работает сейчас. – nsij22

+0

Это потому, что вы не указали тип возвращаемого значения в объявлении метода, поэтому он ожидает пустой кортеж (т. Е. 'Void'), что означает отсутствие возвращаемого значения – Antonio

+0

См. Обновленный ответ – Antonio

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