你好斯威夫特的苏丹!
我是Swift的新手,尽管我经常使用C,C ++和C#。我遇到了一个令我困惑的情况。我将在此处发布代码段:
@IBAction func myFunc(sender: AnyObject)
{
let dirPicker: NSOpenPanel = NSOpenPanel()
dirPicker.allowsMultipleSelection = false
dirPicker.canChooseFiles = true
dirPicker.canChooseDirectories = false
dirPicker.runModal()
let selection = dirPicker.URL
if(selection != nil)
{
do
{
print(selection)
let mp3File = try MP3File(path: (selection?.path)!)
let title = mp3File.getTitle()
// This prints OK
print("Title:\t\(mp3File.getTitle())")
// This prints OK too
print("Title:\t\(title)")
print("Artist:\t\(mp3File.getArtist())")
print("Album:\t\(mp3File.getAlbum())")
print("Lyrics:\n\(mp3File.getLyrics())")
fileName.stringValue = (selection?.path)!
// This sets the label songTitle to an empty space and I can't see why.
// If I initialise title to:
// let title = "STRING CONSTANT"
// ...instead of
// let title = mp3File.getTitle()
// ...then it does actually set the correct text on the label songTitle.
// In both cases, printing to the console works fine! Its just setting
// the text on the label that is eluding me!
songTitle.stringValue = title
}
catch ID3EditErrors.FileDoesNotExist
{
print("Error: File Does Not Exist")
}
catch ID3EditErrors.NotAnMP3
{
print("Error: Not an MP3")
}
catch let e
{
print(e)
}
}
}
当我尝试通过将其stringValue属性设置为变量来设置标签中的文本时,它只显示空白空间,但实际上我可以将变量打印到控制台。该变量设置为函数的返回值。现在,如果我将变量显式设置为字符串常量,那么它可以工作。所以这可能与函数返回值的不确定性有关,但我知道它包含文本,因为我可以将它打印到控制台。
有人能发现这里到底发生了什么吗?
由于
编辑:我刚刚修改了代码中的注释以引用songTitle而不是fileName - 对不起混淆。这是关于设置songTitle.stringValue = title编辑:这是songTitle的定义:
@IBOutlet weak var fileName: NSTextField!
@IBOutlet weak var songTitle: NSTextField!
请注意,只要我没有使用分配了mp3File.getTitle()返回值的变量,设置这些属性的stringValue属性确实有效。另请注意,mp3File.getTitle()确实返回一个值,我可以将它打印到控制台上。
答案 0 :(得分:0)
如果你有一个print
的字符串值很好:
print(title) //->I Ran
但不能很好地处理:
songTitle.stringValue = title //->`songTitle` shows nothing!!!
(当然,您已通过为其指定常量字符串来确认songTitle
没问题。)
一个可能的原因可能是字符串中存在一些控制字符。
您可以使用debugPrint
来揭示此类案例:
debugPrint(title) //->"\0I Ran\0"
debugPrint
使用类似字符串文字的格式来显示控制字符。
在这种情况下,两端都有NUL字符(U + 0000)。
因此,每次获得这样的字符串时,一个快速修复就是修剪它们:
Swift 2 :
let title = mp3File.getTitle().stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "\0"))
Swift 3 :
let title = mp3File.getTitle().trimmingCharacters(in: CharacterSet(charactersIn: "\0"))
或者,如果您无法触摸库的原始来源,则可以编写扩展程序:
Swift 2 :
extension MP3File {
var title: String {
return self.getTitle().stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "\0"))
}
}
Swift 3 :
extension MP3File {
var title: String {
return self.getTitle().trimmingCharacters(in: CharacterSet(charactersIn: "\0"))
}
}
(假设MP3File
没有名为title
的属性。)
并将其用作:
let title = mp3File.title